2012-06-29 5 views
12

Questo fine settimana è un altro molto lungo in quanto sarà disponibile il inserito dopo il 23:59:59 il 30 giugno.Memorizzazione di un secondo intercalare in SQL Server 2008

Abbiamo un sistema che registra una grande quantità di dati 24 ore su 24 e una delle regole aziendali è che non è possibile registrare due record nello stesso momento, entro un secondo.

Stiamo utilizzando i dati UTC insieme al nuovo tipo di dati datetimeoffset, ma per quanto posso dire che non ti permetteranno di avere più di 60 secondi in un minuto.

Certo, questo genera un errore:

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

Ma secondo gli dei UTC questo sarà un tempo reale. Gli eventi possono aver luogo allo 23:59:60 ma non abbiamo modo di registrare questo fatto.

23:59:59 più un secondo offset sarà considerato 00:00:00 il 1 ° luglio.

Come posso registrare correttamente che un evento si è verificato a 23:59:60 nel database?

+4

Sembra che le regole aziendali ignorino la realtà. –

+1

Come mai? Gli eventi registrati non possono verificarsi fisicamente più di una volta al secondo. Non ero a conoscenza che stavi lavorando allo stesso progetto. – Widor

+1

Stavo parlando per scherzo, ma la realtà è che il sistema non può memorizzare un timestamp per il secondo intercalare, quindi non è possibile registrare un evento al secondo durante un secondo intercalare. Le regole aziendali richiedono qualcosa che non può essere facilmente raggiunto attraverso i mezzi tradizionali. Resta le regole, fai un'eccezione per i secondi bisestili o scrivi un codice pazzesco. –

risposta

9

Non è possibile, perché SQL ottiene l'ora da Windows e Windows non supporta neanche i secondi bisestili.

Windows applica i secondi bisestile prendendo la nuova ora dal server dell'ora di upstream e applica le normali regolazioni come se fosse semplice clock drift.

Di solito questo significa regolare ogni secondo di pochi nanosecondi per un periodo prolungato. Più di 24 ore lavorerebbe a circa un millisecondo al minuto.

In sostanza, la maggior parte delle applicazioni è sufficiente far finta che non v'è nulla di simile come secondi bisestili.

Per la maggior parte degli scopi questo non ha importanza. Se hai un'applicazione in cui questo è importante, il sistema operativo non ti aiuterà. Avrai anche bisogno di hardware speciale per il monitoraggio del tempo, in quanto i sistemi operativi generalmente hanno problemi a mantenere il tempo entro un secondo. Windows per impostazione predefinita sincronizza l'ora settimanale o meno spesso e gli orologi hardware PC più economici (o anche quelli in server costosi) possono facilmente andare alla deriva diversi secondi in quel momento.

Dato che ci si preoccupa per l'ora esatta, presumo che si stia indicando su pool.ntp.org o sulla subnet regionale e si sia impostato w32time per la sincronizzazione più volte al giorno.

+0

Tieni presente che adattando l'ora alla successiva sincronizzazione ntp, il tuo orologio rallenta per permettere al futuro di integrarsi nel tuo sistema :) A proposito, quando il tuo orologio è troppo lontano, sarà impostato sul tempo corretto, causando così lo stesso problema con le voci duplicate nel database. MSDN: "[... regola la frequenza di clock ... per consentirgli di convergere verso l'ora corretta. Se la differenza di orario ... è troppo grande ... il servizio orario imposta l'orologio locale ...] (https : //technet.microsoft.com/en-us/library/cc773013 (v = ws.10) aspx # w2k3tr_times_how_izcr)" – eFloh