12

这个周末是一个超长的周末,因为在 6 月 30 日之后将插入额外的第二个23:59:59周末。

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

我们将 UTC 日期时间与新datetimeoffset数据类型一起使用,但据我所知,它们不会让您在一分钟内拥有超过 60 秒的时间。

当然,这会引发错误:

select datediff(ss, getdate(), '30-jun-2012 23:59:60')

但根据 UTC 诸神,这将是一个实时的。事件可以发生在23:59:60但我们无法记录这一事实。

23:59:5900:00:007 月 1 日仍将考虑加上一秒的偏移量。

如何正确记录23:59:60数据库中发生的事件?

4

1 回答 1

9

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

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

通常这意味着在很长一段时间内将每秒调整几纳秒。在 24 小时内,它的运行速度约为每分钟 1 毫秒。

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

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

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

于 2012-06-29T11:42:02.850 回答