Sqlserver
 sql >> Database >  >> RDS >> Sqlserver

La query sui campi datetime con millisecondi restituisce risultati errati in SQL Server

SQL Server memorizza la parte temporale come numero di 1/300 secondo lungo tick dalla mezzanotte.

23:59:59.999 viene arrotondato al segno di spunta più vicino che risulta essere 00:00:00.000 del giorno successivo.

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

Nel primo valore, la parte della data, 0x9B8F (39823 ) è il numero di giorni trascorsi da Jan 1st, 1900 e la parte temporale, 0 , è il numero di tick dalla mezzanotte.

Nel secondo valore, 0x018B81FF (25919999 o 24 * 60 * 60 * 300 - 1 ) è il numero massimo possibile di tick dalla mezzanotte.

Infine, il terzo valore ha 0 nella parte ora e nella parte data aumentate di uno.