2008-10-12 13 views
5

Chcę zapisać wartość C# DateTimeOffset w bazie danych SQL Server 2005.Przechowywanie wartości C# DateTimeOffset w bazie danych SQL Server 2005

Sql 2008 ma to jako wbudowany typ, ale SQL Server 2005 nie.

Struktura DateTimeOffset ma wartość DateTime, którą przechowuję jako DateTime, właściwość Offset (typu TimeSpan). Ponieważ jest to strefa czasowa w stosunku do UTC, prawdopodobnie jest to liczba całkowita lub pół godziny.

Sugestie dotyczące najlepszego sposobu przechowywania w bazie danych SQL Server 2005?

+0

Powiązane pytanie - http://stackoverflow.com/questions/2532729/daylight-saving-time-and-timezone-best-practices – Oded

Odpowiedz

7

To nie jest dobry pomysł, aby przyjąć, że przesunięcie jest liczba godzin lub co pół godziny - nie są z pewnością kwadransa stref czasowych wokół.

Użycie milisekund do przesunięcia jest prawdopodobnie najbardziej elastyczne, ale uważam, że minuty są dużo łatwiejsze do odczytania. Jeśli kiedykolwiek spojrzysz na "surowe" dane w bazie danych, łatwiej jest zrozumieć wartość 60 = 1 godzina niż 3600000. Nie mogę sobie wyobrazić, że naprawdę potrzebujesz ułamków minut jako przesunięcia.

1

przechowywać datetime jako datetime i offset jako milisekund (bigint)

4

Normalizuj wszystkie ustawienia DateTimeOffsets do wspólnego przesunięcia, najlepiej UTC. Następnie zwyczajnie przechowuj DateTime. Po ekstrakcji należy przywrócić przesunięcie, które powinno być stałe. Nie zachowuje to przesunięcia początkowego, ale przesunięcie jest niejednoznaczne względem strefy czasowej.

Jeśli rzeczywiście potrzebujesz znać datę/godzinę rozpoczęcia, musisz zapisać niektóre informacje o strefie czasowej. Dzieje się tak dlatego, że proste przesunięcie nie może jednoznacznie reprezentować pochodzenia czasu. Zobacz (nieco niejasną) dokumentację MSDN na temat Choosing Between DateTime, DateTimeOffset, and TimeZoneInfo.

+0

Uzgodnione - daty przechowywania w formacie UTC i tylko martwić się o strefy czasowe i przesunięcia czasu letniego w momencie prezentacja dla użytkownika. –

+1

Nie zgadzam się. Struktura DateTimeOffset (w C# i SQL 2008) przechowuje czas jako UTC lub czas lokalny + przesunięcie. Przechowywanie czasu UTC + przesunięcie odwróci tę relację i spowoduje tylko zamieszanie. –

Powiązane problemy