Abfrage von datetime-Feldern mit Millisekunden gibt falsche Ergebnisse in SQL Server

8

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!).

    
Jenni 12.01.2010, 14:32
quelle

4 Antworten

12

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.

%Vor%

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.

    
Quassnoi 12.01.2010, 14:34
quelle
2

Dies ist kein Fehler. Es ist perfekt erwartetes Verhalten. schaue hier: datetime und smalldatetime

Sie sollten es in

ändern %Vor%     
Mladen Prajdic 12.01.2010 14:35
quelle
1

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%     
quelle
1

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

    
Pat 29.10.2015 23:56
quelle

Tags und Links