在SQL Server 2008中存储闰秒

时间:2012-06-29 10:40:28

标签: sql-server-2008 datetime utc leap-second

本周末是一个超长的周末,因为在23:59:59 6月30日之后会插入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发生的事件?

1 个答案:

答案 0 :(得分:9)

你不能,因为SQL从Windows获得时间,Windows也不支持闰秒。

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

通常这意味着在延长的时间内将每秒调整几纳秒。超过24小时,它将以每分钟大约一毫秒的速度运行。

基本上,大多数应用程序只是假装没有闰秒这样的东西。

对于大多数目的而言,这无关紧要。如果您有一个重要的应用程序,操作系统将无法帮助您。您还需要一些特殊的硬件来跟踪时间,因为操作系统通常无法将时间保持在一秒钟内。默认情况下,Windows每周或更少地同步时间,大多数廉价的PC硬件时钟(甚至是昂贵的服务器中的那些)在这段时间内很容易漂移几秒钟。

由于您确实关心确切的时间,我假设您指向pool.ntp.org或您的区域子网,并且每天都会多次设置w32time进行同步。