Sqlserver
 sql >> Datenbank >  >> RDS >> Sqlserver

Konvertieren Sie SQL Server-Datum/Uhrzeit-Felder, um nur Datumsteile mit indizierten Suchen zu vergleichen

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 (jeder Tick beträgt ca. 3,33 ms) seit Mitternacht (für die Uhrzeit) *.

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`