2008-10-12 5 views
5

Ich möchte einen C# DateTimeOffset-Wert in einer SQL Server 2005-Datenbank speichern.Speichern eines C# DateTimeOffset-Werts in einer SQL Server 2005-Datenbank

Sql 2008 hat dies als ein eingebauter Typ, aber SQL Server 2005 nicht.

Die DateTimeOffset-Struktur hat einen DateTime-Wert, den ich als DateTime speichert, eine Offset-Eigenschaft (vom Typ TimeSpan). Da dies die Zeitzone in Bezug auf UTC ist, ist es vermutlich normalerweise eine ganze Anzahl von Stunden oder halben Stunden.

Vorschläge, wie Sie dies am besten in einer SQL Server 2005-Datenbank speichern können?

+0

Verwandte Frage - http://stackoverflow.com/questions/2532729/daylight-saving-time-and-timezone-best-practices – Oded

Antwort

7

Es ist keine gute Idee, anzunehmen, dass eine eine Anzahl von Stunden oder Halb Stunden versetzt - es gibt sicherlich Viertelstunde Zeitzonen herum.

Die Verwendung von Millisekunden für den Offset ist wahrscheinlich die flexibelste, aber ich würde argumentieren, dass Minuten viel einfacher zu lesen ist. Wenn Sie sich jemals die "rohen" Daten in der Datenbank ansehen, ist es leichter, den Wert 60 = 1 Stunde als 3600000 zu verstehen. Ich kann mir nicht vorstellen, dass Sie wirklich Brüche von Minuten als Offset brauchen.

1

Laden der Datumzeit als Datum- und der Offset als Millisekunden (bigint)

4

Normalisieren Sie alle DateTimeOffsets auf einen gemeinsamen Offset, vorzugsweise UTC. Dann speichern Sie die DateTime wie gewohnt ab. Nach der Extraktion stellen Sie den Offset wieder her, der eine Konstante sein sollte. Dies behält den Ursprungs-Offset nicht bei, aber der Offset ist sowieso in einer Zeitzone mehrdeutig.

Wenn Sie den Ursprung des Datums/der Uhrzeit kennen müssen, müssen Sie einige Zeitzoneninformationen speichern. Dies liegt daran, dass ein einfacher Offset den Ursprung einer Zeit nicht eindeutig darstellen kann. Bitte beachten Sie (die etwas verwirrende) MSDN-Dokumentation über Choosing Between DateTime, DateTimeOffset, and TimeZoneInfo.

+0

Einverstanden - speichern Sie Daten als UTC und nur Sorgen über Zeitzonen und DST Offsets im Moment Präsentation für den Benutzer. –

+1

Ich stimme nicht zu. Die DateTimeOffset-Struktur (in C# und SQL 2008) speichert die Zeit als UTC oder lokale Zeit + Offset. Das Speichern einer UTC-Zeit + Offset würde diese Beziehung umkehren und nur zu Verwirrung führen. –

Verwandte Themen