这个周末是一个很长的一个,因为在6月30日23:59:59之后会有一个
extra second插入.
我们有一个全天候记录大量数据的系统,其中一个业务规则是,没有两个记录可以记录为同时发生,在一秒钟内.
我们正在使用UTC数据时间以及新的datetimeoffset
数据类型,但据我所知,他们不会让您在一分钟内超过60秒.
当然这会造成错误:
select datediff(ss,getdate(),'30-jun-2012 23:59:60')
但是根据UTC神,这将是一个实时的.活动可以在23:59:60进行,但是我们无法记录这个事实.
23:59:59加上一秒钟的抵消仍将被视为7月1日00:00:00.
如何正确记录事件发生在23:59:60的数据库?
解决方法
您不能,因为sql从Windows获取时间,Windows也不支持闰秒.
Windows通过从上游时间服务器获取新的时间来应用闰秒,并应用通常的调整,就像它是简单的clock drift.
通常这意味着在延长的时间内每秒调整几纳秒.超过24小时,每分钟约一毫秒就会出现.
> Windows时间服务如何处理闰秒:http://support.microsoft.com/kb/909614
> Does the windows FILETIME structure include leap seconds?
> Windows Time Service的工作原理:http://technet.microsoft.com/en-us/library/cc773013(v=ws.10).aspx
基本上,大多数应用程序只是假装没有像闰秒这样的东西.
对于大多数目的,这并不重要.如果您有一个这样的应用程序,操作系统将不会帮助您.您还需要一些特殊的硬件跟踪时间,因为操作系统通常无法保持时间到一秒钟内. Windows默认同步每周或更少的时间,最便宜的PC硬件时钟(或甚至昂贵的服务器)可以轻松漂移几秒钟.
由于您确实关心确切的时间,我假设您指向pool.ntp.org或您的区域子网,并且每天设置w32time进行同步多次.