我已经在 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 …Run Code Online (Sandbox Code Playgroud) 我有没有理由每次都停止使用SYSDATETIME()而不是GETDATE()?
难道他们都不问cpu是什么时候,或者sysdatetime需要更多指令来计算分数?Getdate是否正在进行四舍五入?sysdatetime可以更快,因为它不能进行舍入吗?
如果我不存储纳秒,我显然不会使用sysdatetime,但我问的是存储大小以外的成本.(我正在开发的当前应用程序每秒运行sysdatetime()至少280次)
我正在尝试将一个表中的数据插入到具有双列键的表中.源表不共享目标的密钥.目标中的两个键列都是varchars.
我有一个插入声明:
INSERT INTO Table1 (Invoice, DetailLine, SomeData1, SomeData2)
SELECT ('1'+RIGHT('00000000000000' + CONVERT(varchar, DatePart(ns,SYSDATETIME()), 14), 0, 'STARTING_VALUE_1407', [ActualValue]
FROM Table2;
Run Code Online (Sandbox Code Playgroud)
当我执行上面的操作时,我的DateTime2对象的毫秒数都是相同的,好像它只评估该值一次.这使我无法将其用作临时唯一键.是否可以在SELECT语句中使用SYSDATETIME()或任何其他日期函数,并为每行重新评估值?如果没有,在选择通常不共享目标表键的数据时,是否有办法在执行INSERT INTO SELECT时生成唯一值?
我试图让Datediff之间GETDATE()并SYSDATETIME()以毫秒为单位.
SELECT DATEDIFF(ms, GETDATE() , SYSDATETIME());
Run Code Online (Sandbox Code Playgroud)
我得到的结果是0或1或2或3.造成这种差异的原因是什么?
sysdatetime ×4
sql-server ×3
getdate ×2
sql ×2
datediff ×1
datetime ×1
datetime2 ×1
select ×1
t-sql ×1