Ich komme zu einem seltsamen Bug, der Datetime-Felder in SQL Server 2005 verwendet. Das Datetime-Feld wird mit Millisekunden-Genauigkeit angezeigt, aber es scheint, dass die Millisekunden nicht immer verwandt werden. Hier ist meine Testabfrage:
%Vor%In meinen Ergebnissen bekomme ich:
%Vor%Das Problem ist, dass ich das Datum 2010-01-01 bekommen habe, obwohl das nicht kleiner oder gleich "2009-12-31 23: 59: 59.999" sein sollte. Aber wenn ich die Abfrage ändern, um "2009-12-31 23: 59: 59.99 8 " zu verwenden, funktioniert es OK (keine 2010 Datumswerte werden zurückgegeben).
Ist das ein Fehler, oder funktioniert SQL Server so? Wenn es so funktioniert, gibt es einen Grund dafür? Ich stieß auf diese Migration einige Abfragen von MySQL, wo dies wie erwartet funktioniert (obwohl MySQL nicht einmal die Millisekunden speichert!).
SQL Server
speichert den Zeitteil als Anzahl der 1/300
Sekunden langen Ticks ab Mitternacht.
23:59:59.999
wird auf den nächsten Tick gerundet, der zufällig 00:00:00.000
des nächsten Tages ist.
Im ersten Wert ist der Datumsteil 0x9B8F
( 39823
) die Anzahl der Tage seit Jan 1st, 1900
und der Zeitteil 0
ist die Anzahl der Ticks seit Mitternacht.
Im zweiten Wert ist 0x018B81FF
( 25919999
oder 24 * 60 * 60 * 300 - 1
) die maximal mögliche Anzahl von Ticks seit Mitternacht.
Schließlich hat der dritte Wert die 0
im Zeitteil und der Datumsteil um eins erhöht.
Dies ist kein Fehler. Es ist perfekt erwartetes Verhalten. schaue hier: datetime und smalldatetime
Sie sollten es in
ändern %Vor%Bei allen Fließkommatypen, und ein Datum / eine Zeit ist eigentlich eine Art Gleitkommawert, sollten Sie versuchen, Gleichheitsvergleiche wie diese zu vermeiden.
Also statt:
%Vor%sollten Sie tun:
%Vor%Anstatt den letzten Wert aufzuzählen, den Sie enthalten möchten, listen Sie den ersten auszuschließenden Wert auf. Im Allgemeinen funktioniert dies besser, wenn die Grenzen ganzzahlig sind, da sie eine viel größere Chance haben, in der Domäne genau dargestellt zu werden der Typ.
In Ihrem speziellen Fall würde ich es ändern zu:
%Vor%Aus diesem Grund wird der Vergleichsoperator "Between" nicht für Datumsangaben empfohlen. 'Between' ist ein inklusiver Vergleich (Werte, die zu beiden Enden passen) und wie oben empfohlen, sollten Sie eine exklusive Version von zwischen wie Bodenwert & lt; Testwert & lt; topvalue
Tags und Links sql datetime sql-server-2005