Der beste Weg, den Zeitteil eines datetime-Felds zu entfernen, ist die Verwendung von datediff- und dateadd-Funktionen.
DateAdd(day, datediff(day,0, MydateValue), 0)
Dies macht sich die Tatsache zunutze, dass SQL Server Datumsangaben als zwei Ganzzahlen speichert, von denen eine die Anzahl der Tage seit dem Tag „0“ – (1. Januar 1900) darstellt und die zweite die Anzahl der Ticks
Die obige Formel muss einfach nur die erste Ganzzahl lesen. Es ist keine Konvertierung oder Verarbeitung erforderlich, daher ist es extrem schnell.
Damit Ihre Abfragen einen Index verwenden ... verwenden Sie diese Formel zuerst für die Eingabefilterparameter oder auf der "anderen" Seite des Gleichheitszeichens aus dem Datums-/Uhrzeitfeld der Tabelle, damit der Abfrageoptimierer die Berechnung nicht ausführen muss für jedes datetime-Feld in der Tabelle, um zu bestimmen, welche Zeilen das Filterprädikat erfüllen. Dadurch wird Ihr Suchargument "SARG-fähig" (Search ARGument)
Where MyDateTimeColumn > DateAdd(day,
datediff(day,0, @MydateParameter), 0) -- SARG-able
statt
Where DateAdd(day, datediff(day,0,
MyDateTimeColumn ), 0) > @MydateParameter -- Not SARG-able
* HINWEIS. Intern speichert die zweite Ganzzahl (der Zeitteil) Ticks. An einem Tag gibt es 24 x 60 x 60 x 300 =25.920.000 Ticks (zufällig knapp unter dem maximalen Wert, den eine 32-Bit-Ganzzahl halten kann). Sie müssen sich jedoch keine Gedanken darüber machen, wenn Sie eine Datumszeit arithmetisch ändern ... Wenn Sie Werte von Datumszeiten addieren oder subtrahieren, können Sie den Wert als Bruch behandeln, als ob er genau gleich dem Bruchteil eines Tages wäre, als ob der vollständiger datetime-Wert war eine Fließkommazahl, die aus einem ganzzahligen Teil bestand, der das Datum darstellt, und einem Bruchteil, der die Uhrzeit darstellt). d.h.
`Declare @Dt DateTime Set @Dt = getdate()
Set @Dt = @Dt + 1.0/24 -- Adds one hour
Select @Dt
Set @Dt = @Dt - .25 -- Moves back 6 hours
Select @Dt`