这个周末是一个特别长的周末,因为在 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 进行同步。