Sqlserver
 sql >> Datenbank >  >> RDS >> Sqlserver

Millisekunden falsch beim Konvertieren von XML in SQL Server datetime

Ja, SQL Server rundet die Zeit auf 3.(3) Millisekunden:

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

Wie Sie sehen können, sind diese DATETIME unterscheiden sich durch 1 zweitens, und ihre binären Darstellungen unterscheiden sich durch 0x12C , also 300 in Dezimalzahl.

Dies liegt daran, dass SQL Server speichert die time Teil von DATETIME als Zahl von 1/300 Sekunde tickt ab Mitternacht.

Wenn Sie mehr Genauigkeit wünschen, müssen Sie eine TIME speichern Teil als separater Wert. Speichern Sie beispielsweise die auf eine Sekunde gerundete Zeit als DATETIME , und Millisekunden oder was auch immer Sie für eine Genauigkeit als INTEGER benötigen in anderen Spalten.

Dadurch können Sie den komplexen DATETIME verwenden Arithmetik, wie das Addieren von Monaten oder das Finden von Wochentagen auf DATETIME 's, und Sie können einfach die Millisekunden addieren oder subtrahieren und das Ergebnis als .XXXXXX+HH:MM verketten gültiges XML zu erhalten Vertretung.