Sqlserver
 sql >> Base de données >  >> RDS >> Sqlserver

La requête sur les champs datetime avec des millisecondes donne un résultat erroné dans SQL Server

SQL Server stocke la partie horaire sous la forme d'un nombre de 1/300 secondes longues tiques à partir de minuit.

23:59:59.999 est arrondi au tick le plus proche qui se trouve être 00:00:00.000 du lendemain.

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

Dans la première valeur, la partie date, 0x9B8F (39823 ) est le nombre de jours depuis le Jan 1st, 1900 , et la partie horaire, 0 , est le nombre de ticks depuis minuit.

Dans la deuxième valeur, 0x018B81FF (25919999 , ou 24 * 60 * 60 * 300 - 1 ) est le nombre maximal possible de ticks depuis minuit.

Enfin, la troisième valeur a le 0 dans la partie heure et la partie date augmentées de un.