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

Die Abfrage von Datetime-Feldern mit Millisekunden ergibt ein falsches Ergebnis in SQL Server

SQL Server speichert den Zeitteil als Zahl von 1/300 Sekundenlange Ticks ab Mitternacht.

23:59:59.999 wird auf den nächsten Tick gerundet, der zufällig 00:00:00.000 ist des nächsten Tages.

SELECT  CAST(CAST('2009-12-01 00:00:00.000' AS DATETIME) AS BINARY(8)),
        CAST(CAST('2009-12-01 23:59:59.997' AS DATETIME) AS BINARY(8)),
        CAST(CAST('2009-12-01 23:59:59.999' AS DATETIME) AS BINARY(8))



0x00009B8F 00000000    0x00009B8F 018B81FF    0x00009B90 00000000

Im ersten Wert, dem Datumsteil, 0x9B8F (39823 ) ist die Anzahl der Tage seit dem Jan 1st, 1900 , und der Zeitteil, 0 , ist die Anzahl der Ticks seit Mitternacht.

Im zweiten Wert 0x018B81FF (25919999 , oder 24 * 60 * 60 * 300 - 1 ) ist die maximal mögliche Anzahl von Ticks seit Mitternacht.

Der dritte Wert schließlich hat die 0 im Zeitteil und im Datumsteil um eins erhöht.