2012-06-29 21 views
12

Este fin de semana es muy largo ya que habrá un extra second insertado después de 23:59:59 el 30 de junio.Almacenamiento de un segundo intercalar en SQL Server 2008

Tenemos un sistema que registra una gran cantidad de datos durante todo el día y una de las reglas de negocios es que no se pueden registrar dos registros que se han producido al mismo tiempo, dentro de un segundo.

Estamos usando fechas UTC junto con el nuevo tipo de datos datetimeoffset, pero por lo que yo sé, no le permitirán tener más de 60 segundos en un minuto.

Ciertamente, esto arroja un error:

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

Pero de acuerdo con los dioses UTC Este será un tiempo real. Los eventos pueden tener lugar en 23:59:60, pero no tenemos forma de registrar este hecho.

23:59:59 más una segunda compensación todavía se considerarán 00:00:00 el 1 de julio.

¿Cómo puedo registrar correctamente que ocurrió un evento en 23:59:60 en la base de datos?

+4

Parece que las reglas de su negocio ignoran la realidad. –

+1

¿Cómo es eso? Los eventos que se registran no pueden ocurrir físicamente más de una vez por segundo. Tampoco sabía que estabas trabajando en el mismo proyecto. – Widor

+1

Estaba hablando en broma, pero la realidad es que el sistema no puede almacenar una marca de tiempo para el segundo intercalar, por lo tanto, no es posible registrar un evento por segundo durante un segundo intercalar. Las reglas comerciales requieren algo que no se puede cumplir fácilmente a través de los medios tradicionales. Repensar las reglas, hacer excepciones para los segundos intercalares, o escribir un código loco loco. –

Respuesta

9

No se puede, porque SQL obtiene el tiempo de Windows, y Windows tampoco admite segundos intercalares.

Windows aplica segundos extra tomando el nuevo tiempo del servidor de tiempo de subida y aplicando los ajustes habituales como si fuera simple clock drift.

Por lo general, esto significa ajustar cada segundo unos pocos nanosegundos durante un período prolongado. Más de 24 horas funcionaría a aproximadamente un milisegundo por minuto.

Básicamente, la mayoría de las aplicaciones, simplemente pretender que no hay tal cosa como segundos intercalares.

Para la mayoría de los propósitos esto no importa. Si tiene una aplicación donde esto es importante, el sistema operativo no lo ayudará. También necesitará algún hardware especial para el tiempo de seguimiento, ya que los sistemas operativos generalmente tienen problemas para mantener el tiempo dentro de un segundo de todos modos. Windows por defecto sincroniza el tiempo semanalmente o con menos frecuencia, y los relojes de hardware de PC más baratos (o incluso aquellos en servidores caros) pueden derivar fácilmente varios segundos en ese momento.

Dado que le importa la hora exacta, supongo que está apuntando a pool.ntp.org o su subred regional y ha configurado w32time para la sincronización varias veces al día.

+0

Tenga en cuenta que al adaptar la hora en la próxima sincronización ntp, su reloj se ralentizará para permitir que el futuro se integre en su sistema :) Por cierto, cuando su reloj esté demasiado lejos, se establecerá en el hora correcta, lo que causa el mismo problema con las entradas duplicadas en su base de datos. MSDN: "[... ajusta la frecuencia del reloj ... para permitir que converja hacia la hora correcta. Si la diferencia de tiempo ... es demasiado grande ... el servicio horario establece el reloj local ...] (https : //technet.microsoft.com/en-us/library/cc773013 (v = ws.10) .aspx # w2k3tr_times_how_izcr) " – eFloh