本周末是一个超长的周末,因为在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
发生的事件?
答案 0 :(得分:9)
你不能,因为SQL从Windows获得时间,Windows也不支持闰秒。
Windows通过从上游时间服务器获取新时间来应用闰秒,并应用通常的调整,就像它是简单的clock drift一样。
通常这意味着在延长的时间内将每秒调整几纳秒。超过24小时,它将以每分钟大约一毫秒的速度运行。
基本上,大多数应用程序只是假装没有闰秒这样的东西。
对于大多数目的而言,这无关紧要。如果您有一个重要的应用程序,操作系统将无法帮助您。您还需要一些特殊的硬件来跟踪时间,因为操作系统通常无法将时间保持在一秒钟内。默认情况下,Windows每周或更少地同步时间,大多数廉价的PC硬件时钟(甚至是昂贵的服务器中的那些)在这段时间内很容易漂移几秒钟。
由于您确实关心确切的时间,我假设您指向pool.ntp.org或您的区域子网,并且每天都会多次设置w32time进行同步。