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.