在SQL Server 2008中存储闰秒

12

这个周末会格外漫长,因为在6月30日的23:59:59之后会插入一个额外的秒

我们有一个系统在全天记录大量数据,其中一个业务规则是任何两条记录的记录时间不能相同,误差不能超过1秒。

我们正在使用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的事件?


4
似乎你的业务规则忽略了现实。 - Kevin P. Rice
1
怎么会这样?被记录的事件物理上不可能每秒发生超过一次。我也不知道你也在做同一个项目。 - Widor
1
我只是开玩笑,但现实是系统无法为闰秒存储时间戳,因此在闰秒期间不可能每秒记录一个事件。业务规则要求一些通过传统手段很难满足的东西。重新考虑规则,为闰秒特例做出例外,或编写疯狂的一次性代码。 - Kevin P. Rice
疯狂的一行代码听起来很吸引人!:-D - Prof. Falken
1个回答

9

你不能这样做,因为SQL从Windows获取时间,而Windows也不支持闰秒。

Windows通过从上游时间服务器获取新时间,并应用通常的调整来应用闰秒,就好像它是简单的时钟漂移一样。

通常这意味着在一个延长的时间段内每秒调整几纳秒。在24小时内,每分钟大约会有一毫秒的调整。

基本上,大多数应用程序都会假装没有闰秒这个东西。
对于大多数情况来说,这并不重要。如果你有一个关注这个问题的应用程序,操作系统将无法帮助你。你还需要一些特殊的硬件来跟踪时间,因为操作系统通常很难保持时间在一秒以内。Windows默认每周或更少频繁地同步时间,而大多数廉价的PC硬件时钟(甚至是昂贵的服务器中的时钟)在那段时间内可以轻松漂移几秒钟。
既然你关心确切的时间,我假设你正在指向pool.ntp.org或你的区域子网,并已经设置了w32time进行每天几次的同步。

请注意,通过在下一次NTP同步时调整时间,您的时钟将会减慢速度,以让未来融入您的系统 :) 顺便说一句,如果您的时钟差距太大,它将被设置为正确的时间,从而在数据库中造成重复条目的问题。MSDN:“... 调整时钟速率… 使其向正确时间趋近。如果时间差异太大… 时间服务将设置本地时钟… - eFloh

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接