12 Stimmen

Speichern einer Schaltsekunde in SQL Server 2008

Dieses Wochenende ist ein besonders langes Wochenende, denn es wird ein zusätzliche Sekunde eingefügt nach 23:59:59 am 30. Juni.

Wir haben ein System, das rund um die Uhr eine Vielzahl von Daten protokolliert, und eine der Geschäftsregeln besagt, dass keine zwei Datensätze innerhalb einer Sekunde als gleichzeitig aufgetreten protokolliert werden dürfen.

Wir verwenden UTC-Datumszeiten zusammen mit dem neuen datetimeoffset Datentyp, aber soweit ich weiß, kann man in einer Minute nicht mehr als 60 Sekunden haben.

Dies führt natürlich zu einem Fehler:

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

Aber laut den UTC-Göttern wird dies eine echte Zeit sein. Ereignisse können stattfinden um 23:59:60 aber wir haben keine Möglichkeit, diese Tatsache zu dokumentieren.

23:59:59 plus eine Sekunde Versatz wird weiterhin berücksichtigt 00:00:00 am 1. Juli.

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

9voto

Ben Punkte 33703

Das geht nicht, weil SQL die Zeit von Windows erhält und Windows auch keine Schaltsekunden unterstützt.

Windows wendet Schaltsekunden an, indem es die neue Zeit vom vorgelagerten Zeitserver übernimmt und die üblichen Anpassungen vornimmt, als ob es sich um eine einfache Taktdrift .

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

Im Grunde genommen tun die meisten Anwendungen einfach so, als gäbe es keine Schaltsekunden.

Für die meisten Zwecke spielt das keine Rolle. Wenn Sie eine Anwendung haben, bei der dies wichtig ist, wird Ihnen das Betriebssystem nicht helfen. Außerdem benötigen Sie spezielle Hardware für die Zeitmessung, da Betriebssysteme in der Regel ohnehin Schwierigkeiten haben, die Zeit auf eine Sekunde genau zu halten. Windows synchronisiert die Zeit 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 um mehrere Sekunden abweichen.

Da Ihnen die genaue Zeit wichtig ist, nehme ich an, dass Sie auf pool.ntp.org oder Ihr regionales Subnetz verweisen und w32time so eingestellt haben, dass es mehrmals am Tag synchronisiert wird.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X