Sqlserver
 sql >> Base de Dados >  >> RDS >> Sqlserver

Consulta em campos de data e hora com milissegundos dá resultado errado no SQL Server


SQL Server armazena a parte do tempo como número de 1/300 segundos longos tiques a partir da meia-noite.

23:59:59.999 é arredondado para o tick mais próximo, que é 00:00:00.000 do dia seguinte.
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

No primeiro valor, a parte da data, 0x9B8F (39823 ) é o número de dias desde Jan 1st, 1900 , e a parte do tempo, 0 , é o número de tiques desde a meia-noite.

No segundo valor, 0x018B81FF (25919999 , ou 24 * 60 * 60 * 300 - 1 ) é o número máximo possível de tiques desde a meia-noite.

Finalmente, o terceiro valor tem o 0 na parte da hora e a parte da data aumentada em um.