Sqlserver
 sql >> Database >  >> RDS >> Sqlserver

Millisecondi errati durante la conversione da XML a datetime di SQL Server

Sì, SQL Server arrotonda il tempo a 3.(3) millisecondi:

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

Come puoi vedere, questi DATETIME 's differiscono di 1 secondo, e le loro rappresentazioni binarie differiscono di 0x12C , ovvero 300 in decimale.

Questo perché SQL Server memorizza il time parte del DATETIME come numero di 1/300 secondo tick dalla mezzanotte.

Se desideri maggiore precisione, devi memorizzare un TIME parte come valore separato. Ad esempio, memorizza il tempo arrotondato al secondo come DATETIME e millisecondi o qualsiasi altra precisione di cui hai bisogno come INTEGER in un'altra colonna.

Ciò ti consentirà di utilizzare il complesso DATETIME aritmetica, come aggiungere mesi o trovare giorni della settimana su DATETIME 's e puoi semplicemente aggiungere o sottrarre i millisecondi e concatenare il risultato come .XXXXXX+HH:MM per ottenere un XML valido rappresentazione.