这个周末是一个超长的周末,因为会有 extra second插入后 23:59:59
6 月 30 日。
我们有一个全天候记录大量数据的系统,其中一项业务规则是,不能将两条记录同时记录到一秒内。
我们使用 UTC 日期时间以及新的 datetimeoffset
数据类型,但据我所知,他们不会让您在一分钟内拥有超过 60 秒的时间。
当然,这会引发错误:
select datediff(ss, getdate(), '30-jun-2012 23:59:60')
但根据 UTC 众神的说法,这将是一个真实的时间。事件可在
23:59:60
举行但我们无法记录这个事实。23:59:59
加上一秒的偏移量仍将被视为 00:00:00
7 月 1 日。如何正确记录事件发生在
23:59:60
在数据库中?
最佳答案
您不能,因为 SQL 从 Windows 获取时间,而 Windows 也不支持闰秒。
Windows 通过从上游时间服务器获取新时间并应用通常的调整来应用闰秒,就好像它很简单 clock drift .
通常这意味着在很长一段时间内将每秒调整几纳秒。超过 24 小时,它将以每分钟约 1 毫秒的速度运行。
基本上,大多数应用程序只是假装没有闰秒之类的东西。
对于大多数目的,这无关紧要。如果您有一个应用程序,这很重要,操作系统将不会帮助您。您还需要一些特殊的硬件来跟踪时间,因为操作系统通常无法将时间保持在 1 秒以内。默认情况下,Windows 每周或更少地同步时间,并且大多数便宜的 PC 硬件时钟(甚至是昂贵服务器中的时钟)在这段时间内很容易漂移几秒钟。
由于您确实关心确切时间,因此我假设您指向 pool.ntp.org 或您的区域子网,并且每天多次设置 w32time 进行同步。
关于sql-server-2008 - 在 SQL Server 2008 中存储闰秒,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11260310/