Vergleichen Sie den Zeitabschnitt des DateTime-Datentyps in SQL Server 2005

9

Wie kann ich nur den Zeitabschnitt eines DateTime-Datentyps in SQL Server 2005 vergleichen? Zum Beispiel möchte ich alle Datensätze abrufen, in denen MyDateField nach einer bestimmten Zeit ist. Das folgende Beispiel ist ein sehr langer und wahrscheinlich nicht schneller Weg, dies zu tun. Ich möchte alle Daten, bei denen MyDateField größer als 12: 30: 50.400 ist

%Vor%     
Miguel Angelo 04.01.2010, 17:14
quelle

5 Antworten

11
%Vor%     
LukeH 05.01.2010, 11:06
quelle
5

Wie wäre es damit?

%Vor%

Die Stunde wird im 24-Stunden-Format angegeben, z. 12 bedeutet 12 Stunden Mittag, 15 bedeutet 3 Uhr.

DATEPART hat auch "Teile" für Minuten, Sekunden und so weiter. Sie können natürlich so viele dieser Datumsteile in Ihrer WHERE-Klausel verwenden, wie Sie möchten.

    
marc_s 04.01.2010 17:17
quelle
1

Ich wollte den Zeitabschnitt eines DateTime-Datentyps extrahieren und vergleichen. Ich habe einen Weg gefunden, den Datumsteil hier in StackOverflow . Wenn ich den Datumsteil allein habe, subtrahiere ich das Datum einfach von der Quelle DateTime:

datePortion = DATEADD (Tag, DATEDIFF (Tag, 0, sourceDate ), 0)
timePortion = DATEDIFF (Millisekunde, datePortion, sourceDate )

So ist das Makro zum Extrahieren des Zeitabschnitts in SQL Server 2005:

f (x) = DATEDIFF (Millisekunde, DATEADD (Tag, DATEDIFF (Tag, 0, sourceDate ), 0), sourceDate )

Die Abfrage zum Vergleichen des Zeitabschnitts eines DateTime-Felds mit 12: 30: 50.400 lautet nun:

%Vor%

Ich habe diese Abfrage mit anderen Arten von Abfragen getestet, einschließlich der Verwendung des Subtraktionsoperators ('-') und CONVERT. Der Vergleich des Ausführungsplans zeigt, dass dies die schnellste Methode ist. Ich habe auch die realen Zeiten der Abfrageausführung getestet ... es gibt keine auffallend schnellste Methode.

    
Miguel Angelo 04.01.2010 19:58
quelle
1

Andere haben alternative Methoden zum Bilden der Abfrage gepostet, aber ich möchte auf etwas antworten, was Sie im ersten Absatz sagen:

  

Das folgende Beispiel ist ein sehr langer und wahrscheinlich nicht schneller Weg, dies zu tun.

In Bezug auf die Leistung ist es nicht wirklich wichtig, ob Sie einen DATEPART oder einen 10 DATEPARTS drin haben; die Tatsache, dass Sie sogar nur ein DATEPART haben, ist, was der Leistung schadet.

Wenn Sie die Zeit, aber nicht das Datum vergleichen müssen, ist Lasse's Kommentar direkt auf dem Geld - Sie müssen sich in separate Datums- / Zeitspalten normalisieren. Tatsächlich führt SQL 2008 die Typen date und time ein und empfiehlt, diese anstelle von datetime zu verwenden. Sie haben dies nicht in SQL 2005, aber Sie können es umgehen, sagen wir, ein Ticks-Feld für die Tageszeit, und eine Check-Einschränkung, die alle Datentypen der Datumsspalte auf Null zwingt.

Wenn Sie später Filter für das gesamte Datum + Zeit durchführen müssen, ist es einfach, eine berechnete Spalte zu erstellen, und wenn die Leistung für diese ein Problem darstellt, können Sie diese Spalte beibehalten und einen Index dafür erstellen.

>     
Aaronaught 04.01.2010 20:10
quelle
-1

convert (varchar (10), MyDate, 108)

Dies gibt Ihnen eine Zeitfolge des Formats HH: MM: SS.

Sie können dann einen beliebigen Vergleich damit machen

    
zzawaideh 04.01.2010 17:17
quelle

Tags und Links