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%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.
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.
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.
>Tags und Links sql-server sql-server-2005