我在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位小数是完全随机的。
这是正确的陈述,还是有正确的方法来获得真正准确/随机的时间?
答案 0 :(得分:3)
这取决于您的系统。以下摘自MS Docs:
SQL Server通过使用获取日期和时间值 GetSystemTimeAsFileTime()Windows API。准确性取决于 计算机硬件和Windows的实例SQL的版本 服务器正在运行。此API的精度固定为100 纳秒。准确性可以通过使用 GetSystemTimeAdjustment()Windows API。
我希望这会有所帮助。
修改的
将MSDN链接替换为MS Docs。