2016-08-04 15 views
0

Ich habe eine Tabelle in SQL Server 2014 mit Zeitstempeln.Vergleichen Sie Datumsangaben aus der SQL Server-Tabelle mit einer Datetime von Benutzer und ermitteln Sie das Datum aus der Tabelle, die der Datetime des Benutzers am nächsten liegt

Dies ist meine Tabelle:

enter image description here

ich mit einem Zeitstempel, die I-Eingang jeden Zeitstempel von meinem Tisch vergleichen will und aus meiner Tabelle den Zeitstempel erhalten, für die die datediff(table_timeStamp, @myTimestamp) ist die kleinste . Hoffe es ist klar was ich will. Dies ist für eine Funktion und ich möchte wissen, wie kann ich das auf die einfachste Weise tun?

+0

Nur um klar zu sein, Ihr time_stamp ist eigentlich ein Datumsfeld und kein Zeitstempel? –

+0

In meiner Tabelle ist der Typ der Spalte 'Time_Stamp' datetime –

+0

SELECT TOP 1 * ........... Sortierung durch ABS (datediff (s, table_timeStamp, @myTimestamp)) – Cato

Antwort

2
SELECT TOP 1 * ........... order by ABS(datediff(second,table_timeStamp, @myTimestamp)) 
0

Diese Abfrage funktioniert viel schneller, wenn Tabelle einen Index auf Time_Stamp Spalte hat. Die Abfrage winner führt IMMER einen Tabellenscan und einen NEWER-Index überhaupt durch.

SELECT TOP 1 Time_Stamp FROM 
    SELECT Max(Time_Stamp) as Time_Stamp FROM MyTable WHERE Time_Stamp < @myTimestamp 
UNION 
    SELECT MIN(Time_Stamp) as Time_Stamp FROM MyTable WHERE Time_Stamp > @myTimestamp) 
ORDER BY 1 
+0

Obwohl dieser Code helfen kann das Problem zu lösen, zusätzlichen Kontext in Bezug auf _why_ und/oder _how_ es Antworten die Frage würde erheblich verbessern seine langfristige Wert. Bitte [bearbeiten] Sie Ihre Antwort, um eine Erklärung hinzuzufügen. –

+0

Es ist einfach. Im Falle eines Index auf "Time_Stamp" ist mein Code schneller. –

+0

Bitte [bearbeiten] Sie Ihre Antwort, um diese Erklärung hinzuzufügen. Die anderen Antworten behandeln die Geschwindigkeit überhaupt nicht, also ist das eine Möglichkeit, die eigenen von ihnen zu unterscheiden. :-) –

0

Wenn Sie das nächste Datum vor der Datumseingabe:

;With cteTestDates As 
(
Select *, DateDiff(Second,datefield1, '2016-07-01') DateDifference 
    From TestDates 
) 
Select Top 1 * 
    From cteTestDates 
    Where DateDifference >= 0 
    Order By DateDifference 

Wenn Sie das nächste Datum wollen unabhängig davon, ob es in der Vergangenheit oder Zukunft ist:

;With cteTestDates As 
(
Select *, ABS(DateDiff(Second,datefield1, '2016-07-03')) DateDifference 
    From TestDates 
) 
Select Top 1 * 
    From cteTestDates 
    Order By DateDifference