Tak, SQL Server
zaokrągla czas do 3.(3)
milisekundy:
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
Jak widać, te DATETIME
różnią się o 1
po drugie, a ich reprezentacje binarne różnią się o 0x12C
, czyli 300
w systemie dziesiętnym.
Dzieje się tak, ponieważ SQL Server
przechowuje time
część DATETIME
jako liczba 1/300
drugie tyka od północy.
Jeśli chcesz uzyskać większą precyzję, musisz zapisać TIME
część jako oddzielna wartość. Na przykład, przechowuj czas zaokrąglony do sekundy jako DATETIME
, oraz milisekundy lub dowolna precyzja, jakiej potrzebujesz jako INTEGER
w innych kolumnach.
Umożliwi Ci to użycie złożonej DATETIME
arytmetyki, takie jak dodawanie miesięcy lub znajdowanie dni tygodnia w DATETIME
i możesz po prostu dodać lub odjąć milisekundy i połączyć wynik jako .XXXXXX+HH:MM
aby uzyskać prawidłowy XML
reprezentacja.