sql >> Base de Datos >  >> RDS >> Sqlserver

Milisegundos incorrectos al convertir de XML a SQL Server datetime

Sí, SQL Server redondea el tiempo a 3.(3) milisegundos:

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

Como puede ver, estos DATETIME difieren en 1 segundo, y sus representaciones binarias difieren en 0x12C , eso es 300 en decimal.

Esto se debe a que SQL Server almacena el time parte del DATETIME como un número de 1/300 segundo tic desde la medianoche.

Si desea más precisión, debe almacenar un TIME parte como un valor separado. Como, almacenar el tiempo redondeado a un segundo como DATETIME , y milisegundos o cualquier precisión que necesite como INTEGER en otras columnas.

Esto le permitirá usar DATETIME complejo aritmética, como sumar meses o encontrar días de la semana en DATETIME 's, y puede sumar o restar los milisegundos y concatenar el resultado como .XXXXXX+HH:MM para obtener un XML válido representación.