2012-06-29 13 views
12

Dieses Wochenende ist ein extra langes, da am 30. Juni ein extra second nach 23:59:59 eingefügt wird.Speichern einer Schaltsekunde in SQL Server 2008

Wir haben ein System, das viele Daten rund um die Uhr protokolliert und eine der Geschäftsregeln ist, dass keine zwei Datensätze protokolliert werden können, die zur selben Zeit innerhalb einer Sekunde aufgetreten sind.

Wir verwenden UTC-Datumsangaben zusammen mit dem neuen datetimeoffset-Datentyp, aber soweit ich sagen kann, werden sie nicht mehr als 60 Sekunden pro Minute haben.

Sicherlich führt dies auf einen Fehler:

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

Aber nach den UTC Götter wird dies eine Echtzeit sein. Veranstaltungen können unter 23:59:60 stattfinden, aber wir haben keine Möglichkeit, diese Tatsache zu erfassen.

23:59:59 plus 1 Sekunde Offset wird am 01. Juli noch als 00:00:00 betrachtet.

Wie kann ich korrekt protokollieren, dass ein Ereignis bei 23:59:60 in der Datenbank aufgetreten ist?

+4

Es scheint, dass Ihre Geschäftsregeln die Realität ignorieren. –

+1

Wie? Die protokollierten Ereignisse können physisch nicht mehr als einmal pro Sekunde auftreten. Mir war nicht bewusst, dass du auch an dem gleichen Projekt arbeitest. – Widor

+1

Ich habe im Scherz gesprochen, aber die Realität ist, dass das System keinen Zeitstempel für die Schaltsekunde speichern kann, daher ist es nicht möglich, ein Ereignis pro Sekunde während einer Schaltsekunde zu protokollieren. Geschäftsregeln erfordern etwas, was mit herkömmlichen Mitteln nicht einfach zu erreichen ist. Regeln neu überdenken, Ausnahmen für Schaltsekunden machen oder verrückten Einmalcode schreiben. –

Antwort

9

Sie können nicht, da SQL die Zeit von Windows bezieht und Windows keine Schaltsekunden unterstützt.

Windows wendet Schaltsekunden an, indem es die neue Zeit vom Upstream-Zeitserver übernimmt und die üblichen Anpassungen anwendet, als ob es einfach wäre clock drift.

Normalerweise bedeutet dies, dass jede Sekunde über einen längeren Zeitraum um einige Nanosekunden angepasst wird. Über 24 Stunden würde es bei etwa einer Millisekunde pro Minute funktionieren.

Grundsätzlich meisten Anwendungen einfach so tun, dass es nicht so etwas ist als Schaltsekunden.

Für die meisten Zwecke ist dies egal. Wenn Sie eine Anwendung haben, in der dies wichtig ist, wird das Betriebssystem Ihnen nicht helfen. Sie benötigen auch einige spezielle Hardware für die Verfolgungszeit, da OS's im Allgemeinen Mühe haben, die Zeit trotzdem auf eine Sekunde zu reduzieren. Windows synchronisiert die Uhrzeit standardmäßig wöchentlich oder seltener, und die meisten billigen PC-Hardware-Uhren (oder sogar die in teuren Servern) können in dieser Zeit leicht mehrere Sekunden treiben.

Da Sie sich um die genaue Zeit kümmern, gehe ich davon aus, dass Sie auf pool.ntp.org oder Ihr regionales Subnetz zeigen und w32time für die Synchronisation mehrmals am Tag eingestellt haben.

+0

Beachten Sie, dass Ihre Uhr durch Anpassen der Zeit bei der nächsten NTP-Synchronisierung langsamer wird, um die Zukunft in Ihr System zu integrieren :) Übrigens, wenn Ihre Uhr zu weit entfernt ist, wird sie auf die eingestellt korrekte Zeit, wodurch das gleiche Problem mit doppelten Einträgen in Ihrer Datenbank verursacht wird. MSDN: "[... passt die Taktrate ... an, damit sie zur richtigen Zeit konvergiert. Wenn die Zeitdifferenz ... zu groß ist ... stellt der Zeitdienst die lokale Uhr ein ...] (https : //technet.microsoft.com/en-us/library/cc773013 (v = ws.10) .aspx # w2k3tr_times_how_izcr) " – eFloh