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

Milissegundos errados ao converter de XML para data e hora do SQL Server


Sim, SQL Server arredonda o tempo para 3.(3) milissegundos:
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 você pode ver, estes DATETIME 's diferem em 1 segundo, e suas representações binárias diferem em 0x12C , que é 300 em decimal.

Isso ocorre porque o SQL Server armazena a time parte do DATETIME como um número de 1/300 segundos da meia-noite.

Se você quiser mais precisão, você precisa armazenar um TIME parte como um valor separado. Por exemplo, armazene o tempo arredondado para um segundo como um DATETIME , e milissegundos ou qualquer precisão que você precise como um INTEGER em outras colunas.

Isso permitirá que você use DATETIME complexo aritmética, como adicionar meses ou encontrar dias da semana em DATETIME 's, e você pode apenas adicionar ou subtrair os milissegundos e concatenar o resultado como .XXXXXX+HH:MM para obter um XML válido representação.