2012-06-29 20 views
12

Ten weekend jest wyjątkowo długi, ponieważ po 23:59:59 wstawiony zostanie 30 czerwca.Przechowywanie sekundy przestępnej w SQL Server 2008

Mamy system, który rejestruje wiele danych przez całą dobę, a jedną z reguł biznesowych jest to, że nie można rejestrować dwóch rekordów jednocześnie w ciągu jednej sekundy.

Korzystamy z dat danych UTC wraz z nowym typem danych datetimeoffset, ale z tego co wiem, nie pozwalają one na więcej niż 60 sekund na minutę.

Oczywiście, to zgłasza błąd:

select datediff(ss, getdate(), '30-jun-2012 23:59:60') 

Ale według bogów UTC będzie to w czasie rzeczywistym. Wydarzenia mogą mieć miejsce pod numerem 23:59:60, ale nie mamy możliwości zarejestrowania tego faktu.

23:59:59 plus jedna sekundowa offset będzie nadal uznawana za 00:00:00 1 lipca.

Jak poprawnie zalogować, że zdarzenie miało miejsce w 23:59:60 w bazie danych?

+4

Wygląda na to, że reguły biznesowe ignorują rzeczywistość. –

+1

Jak to zrobić? Rejestrowane zdarzenia nie mogą fizycznie wystąpić więcej niż raz na sekundę. Nie wiedziałem też, że pracujesz nad tym samym projektem. – Widor

+1

Mówiłem żartem, ale rzeczywistość jest taka, że ​​system nie może przechowywać znacznika czasu dla sekundy przestępnej, dlatego nie jest możliwe rejestrowanie jednego zdarzenia na sekundę podczas sekundy przestępnej. Reguły biznesowe wymagają czegoś, czego nie można łatwo osiągnąć za pomocą tradycyjnych środków. Przemyśl zasady, zrób wyjątek dla sekund przestępnych lub napisz szalony jednorazowy kod. –

Odpowiedz

9

Nie można, ponieważ SQL pobiera czas z systemu Windows, a system Windows nie obsługuje także sekund przestępnych.

System Windows stosuje sekundy przestępne, pobierając nowy czas z nadrzędnego serwera czasu i stosując zwykłe poprawki tak, jakby były proste: clock drift.

Zazwyczaj oznacza to regulację każdej sekundy o kilka nanosekund przez dłuższy czas. W ciągu 24 godzin sprawdzi się około jednej milisekundy na minutę.

Zasadniczo większość aplikacji po prostu udawać, że nie ma czegoś takiego w sekundach przestępnych.

Dla większości celów nie ma to znaczenia. Jeśli masz aplikację, w której to ma znaczenie, system operacyjny nie pomoże. Będziesz także potrzebował specjalnego sprzętu do śledzenia czasu, ponieważ system operacyjny na ogół ma problem z utrzymaniem czasu w ciągu sekundy. System Windows domyślnie synchronizuje czas co tydzień lub rzadziej, a najtańsze zegary sprzętowe komputerów PC (lub nawet te w drogich serwerach) mogą z łatwością przesuwać się o kilka sekund w tym czasie.

Ponieważ zależy Ci na dokładnym czasie, zakładam, że wskazujesz na pool.ntp.org lub regionalną podsieć i ustawiłeś w32time na synchronizację kilka razy dziennie.

+0

Pamiętaj, że dostosowując czas przy następnej synchronizacji ntp, twój zegar zwolni, aby umożliwić przyszłą integrację w twoim systemie :) Przy okazji, kiedy twój zegar jest zbyt daleko, zostanie on ustawiony na poprawny czas, powodując ten sam problem z duplikatami wpisów w bazie danych. MSDN: "[... dostosowuje częstotliwość taktowania ... aby umożliwić jej zejście w odpowiednim czasie .Jeśli różnica czasu ... jest zbyt duża ... usługa czasu ustawia lokalny zegar ...] (https : //technet.microsoft.com/en-us/library/cc773013 (v = ws.10) .aspx # w2k3tr_times_how_izcr) " – eFloh