5

我已经在 SQL Server 2008 的存储过程中使用 SYSDATETIME 进行了一些测试。我设置了一个带有 IDENTITY 字段的 datetime2(7) 表。

我了解此数据类型的精度和准确性之间的区别,但是,在插入此示例中的多条记录时,我注意到了一个不寻常的结果:

declare @counter int
    set @counter = 0
    while @counter < 100000
    begin
      set @counter = @counter + 1
        INSERT INTO t ([now]) VALUES (SYSDATETIME())
    end

我使用插入语句 100,000 进行循环以确定 SYSDATETIME 是否按预期正常工作。但是,与 GETDATE 相比,它似乎并不准确。

2015-12-01 19:16:58.4102452
2015-12-01 19:16:58.4102452
2015-12-01 19:16:58.4112452
2015-12-01 19:16:58.4112452
2015-12-01 19:16:58.4122453
2015-12-01 19:16:58.4122453
2015-12-01 19:16:58.4132453
2015-12-01 19:16:58.4152455
2015-12-01 19:16:58.4152455
2015-12-01 19:16:58.4162455
2015-12-01 19:16:58.4162455
2015-12-01 19:16:58.4172456
2015-12-01 19:16:58.4172456
2015-12-01 19:16:58.4182456
2015-12-01 19:16:58.4182456
2015-12-01 19:16:58.4192457
2015-12-01 19:16:58.4192457
2015-12-01 19:16:58.4202457
2015-12-01 19:16:58.4202457
2015-12-01 19:16:58.4212458

根据我的观察,最后四位小数似乎独立于前三位而递增。这是执行 100,000 次插入的趋势。

如果您注意到这个小样本摘录中的最后两位小数秒,它会从 0.4212457 跳到 0.4212458。

虽然它具有 7 个位置的精度,但在我看来,精度只有 3 个位置。最后四位数字以独立于时间的增量方式运行。我希望时间值的最后 4 位小数在每次插入数据库时​​都是完全随机的。

这是一个正确的陈述,还是有正确的方法来获得真正准确/随机的时间?

4

1 回答 1

4

这取决于您的系统。以下内容来自MS Docs

SQL Server 使用 GetSystemTimeAsFileTime() Windows API 获取日期和时间值。准确性取决于运行 SQL Server 实例的计算机硬件和 Windows 版本。此 API 的精度固定为 100 纳秒。精度可以通过使用 GetSystemTimeAdjustment() Windows API 来确定。

我希望这有帮助。

编辑

用 MS Docs 替换了 MSDN 链接。

于 2015-12-01T09:28:09.330 回答