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

时间:2015-12-01 09:11:18

标签: sql-server sql-server-2008 getdate datetime2 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

我循环使用insert语句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次插入的趋势。

如果您在此小样本提取中注意到最后两位小数,则会从.4212457跳转到.4212458。

虽然它具有7个位置的精度,但我的视野中的准确度仅为3个位置。最后四位数字以增量方式运行,与时间无关。我希望每次插入数据库时​​,时间值中的最后4位小数是完全随机的。

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

1 个答案:

答案 0 :(得分:3)

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

  

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

我希望这会有所帮助。

修改

将MSDN链接替换为MS Docs。