在 SQL Server 2008 中存储闰秒



这个周末是一个特别长的周末,因为在 6 月 30 日23:59:59之后将额外插入一秒钟。

我们有一个全天候记录大量数据的系统,其中一条业务规则是,没有两条记录可以记录为同时发生,不到一秒钟。

我们使用 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 通过从上游时间服务器获取新时间并应用通常的调整来应用闰秒,就好像它是简单的时钟漂移一样。

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

  • Windows 时间服务如何处理闰秒:http://support.microsoft.com/kb/909614
  • Windows FILETIME 结构是否包括闰秒?
  • Windows 时间服务的工作原理:http://technet.microsoft.com/en-us/library/cc773013(v=ws.10).aspx

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

在大多数情况下,这并不重要。如果您有重要的应用程序,操作系统将无法帮助您。您还需要一些特殊的硬件来跟踪时间,因为操作系统通常很难将时间保持在一秒以内。默认情况下,Windows每周同步时间或频率较低,大多数便宜的PC硬件时钟(甚至是昂贵的服务器中的时钟)很容易在该时间内漂移几秒钟。

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

相关内容

  • 没有找到相关文章

最新更新