SQL Server 中 SYSDATETIME 数据类型的准确性

Lea*_*gue 5 sql-server getdate datetime2 sql-server-2008 sysdatetime

我已经在 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
Run Code Online (Sandbox Code Playgroud)

我循环使用插入语句 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
Run Code Online (Sandbox Code Playgroud)

根据我的观察,最后四位小数似乎与前三位数字无关。这是已执行的 100,000 次插入的趋势。

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

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

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

des*_*ata 4

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

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

我希望这有帮助。

编辑

将 MSDN 链接替换为 MS Docs。