Vergleichen Sie mal Teil des DateTime-Datentyp in SQL Server 2005
Wie kann ich Vergleiche nur die Zeit, die Teil eines DateTime-Datentyp in SQL Server 2005? Zum Beispiel, ich möchte alle Datensätze, in denen MyDateField ist nach einer bestimmten Zeit. Das folgende Beispiel ist ein sehr langer und wahrscheinlich nicht schnell Weg, dies zu tun.
Ich möchte Sie alle Termine, wo MyDateField größer als 12:30:50.400
SELECT *
FROM Table1
WHERE ((DATEPART(hour, MyDateField) = 12) AND (DATEPART(minute, MyDateField) = 30) AND (DATEPART(second, MyDateField) = 50) AND (DATEPART(millisecond, MyDateField) > 400))
OR ((DATEPART(hour, MyDateField) = 12) AND (DATEPART(minute, MyDateField) = 30) AND (DATEPART(second, MyDateField) > 50))
OR ((DATEPART(hour, MyDateField) = 12) AND (DATEPART(minute, MyDateField) > 30))
OR ((DATEPART(hour, MyDateField) > 12))
- Beachten Sie, dass wenn Sie tatsächlich verarbeiten müssen, die das Datum und die Uhrzeit getrennt, sind Sie effektiv brechen normalisierungsregeln. Ein DateTime-Wert einen bestimmten Punkt in der Zeit auf ein Datum. Ein Datum und die Zeit, die ein mehrwertiges Feld, das hättest aufgebrochen. Der Grund, warum Ihr code ausgeführt wird, langsam ist, dass Sie noch nicht normalisiert es richtig.
- wie weit würden Sie diese? Sicherlich werden Sie nicht speichern: Tag, Monat, Jahr, Stunde, minute, Wochentag, Wochenende, Quartal, Woche in separaten Feldern, statt nur speichern Sie das Datum.
- Natürlich könnte ich das separate ein DateTime-Feld in Felder für Datum und Uhrzeit. Aber dann hätte ich das gleiche problem zu vergleichen Datum und Uhrzeit zusammen.
- Sie könnte leicht handhaben, dass der Vergleich mit einer berechneten Spalte, die Sie könnte anhalten und den index für die Leistung, wenn nötig. Daher Stimme ich mit Lasse.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Wie über dieses?
Die Stunde angegeben wird, in der 24-Stunden-format, z.B. 12 bedeutet 12-Stunden-Uhr, 15 bedeutet 3pm.
DATEPART
hat auch "Teile" für Minuten, Sekunden und so weiter. Sie können natürlich, wie viele von denen, Datums-Teile, die in Ihrer WHERE-Klausel, wie Sie möchten.hour >= 12
oder vielleichthour > 12 or (hour = 12 and millisecond > 0)
.time
geben Sie in SQL - '05...Was ich tun wollte, ist zum extrahieren der Zeit-Teils eines DateTime-Datentyp, und der Vergleich. Ich fand einen Weg zum extrahieren des Datums-Teil hier in StackOverflow. Wenn ich die date-Teil allein, es ist nur subtrahieren das Datum von der Quelle DateTime:
datePortion = DATEADD(day, DATEDIFF(day,0, sourceDate), 0)
timePortion = DATEDIFF(Millisekunde, datePortion, sourceDate)
damit das makro zum extrahieren der Zeit-Teil in SQL Server 2005:
f(x) = DATEDIFF(Millisekunde, DATEADD(day, DATEDIFF(day,0, sourceDate), 0), sourceDate)
Nun die Abfrage zu vergleichen, die mal Teil eines DateTime-Feld mit 12:30:50.400 ist:
Ich getestet habe, diese Abfrage gegen andere Arten von Abfragen, einschließlich der Verwendung der Subtraktion-operator ('-'), und KONVERTIEREN. Die Ausführung plan-Vergleich zeigt, dass dies die Schnellste Methode, dies zu tun. Habe ich auch probiert das echt mal von der Ausführung der Abfrage... es gibt keinen spürbaren Schnellste Methode.
WHERE dbo.GetTime(MyDateField) >= @SomeTime
.Andere geschrieben haben zu alternativen Methoden der Bildung der Abfrage, aber ich möchte auf etwas zu reagieren, Sie sagen im ersten Absatz:
Performance-Weise, ist es nicht eigentlich egal, wenn Sie eine haben
DATEPART
oder 10DATEPARTS
dort; die Tatsache, dass Sie selbst einDATEPART
ist, was die Leistung beeinträchtigt.Wenn Sie brauchen, um zu vergleichen, auf Zeit, aber kein Datum, dann lasses Kommentar ist direkt auf das Geld - Sie brauchen, zu normalisieren, in getrennte Datum - /Zeit-Spalten. In der Tat, SQL 2008 führt
date
undtime
Typen und empfiehlt, dass Sie verwenden Sie anstelle vondatetime
. Sie haben dies nicht in SQL 2005, aber Sie arbeiten können, um es mit, sagen wir, eine Zecken-Bereich für time-of-Tag, und eine check-Einschränkung, die erzwingt, dass alle die dateparts der Datum-Spalte auf null.Wenn Sie später brauchen, um Filter auf das vollständige Datum+Zeit, es ist einfach eine berechnete Spalte erstellen, und wenn die Leistung ein Problem für diejenigen, die Sie bestehen können, dass die Spalte, und erstellen Sie einen index für Sie.
convert(varchar(10),MyDate,108)
Dies gibt Ihnen eine Uhrzeit-Zeichenfolge der Form HH:MM:SS.
Können Sie Vergleich Sie wollen mit ihm