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.