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

Millisecondes erronées lors de la conversion de XML en datetime SQL Server

Oui, SQL Server arrondit le temps à 3.(3) millisecondes :

SELECT CAST(CAST('2009-01-01 00:00:00.000' AS DATETIME) AS BINARY(8))
SELECT CAST(CAST('2009-01-01 00:00:01.000' AS DATETIME) AS BINARY(8))

0x00009B8400000000
0x00009B840000012C

Comme vous pouvez le voir, ces DATETIME diffèrent de 1 seconde, et leurs représentations binaires diffèrent de 0x12C , soit 300 en décimal.

C'est parce que SQL Server stocke l'time partie du DATETIME sous la forme d'un nombre de 1/300 secondes à partir de minuit.

Si vous voulez plus de précision, vous devez stocker un TIME partie en tant que valeur distincte. Par exemple, stocker l'heure arrondie à la seconde sous forme de DATETIME , et millisecondes ou toute autre précision dont vous avez besoin en tant que INTEGER dans une autre colonne.

Cela vous permettra d'utiliser des DATETIME complexes l'arithmétique, comme l'ajout de mois ou la recherche de jours de la semaine sur DATETIME 's, et vous pouvez simplement ajouter ou soustraire les millisecondes et concaténer le résultat sous la forme .XXXXXX+HH:MM pour obtenir un XML valide représentation.