首先,我已经解决了我遇到的实际问题,通过使用datetime2和微秒刻度的DATEDIFFing。但我仍然对我所看到的行为感到惊讶,所以....
我
正在尝试诊断某些SQL的性能问题,并且我有这样的循环代码来测试它:
DECLARE @timer datetime = NULL
DECLARE @diff int = 0
DECLARE @total int = 0
WHILE(<condition>)
BEGIN
SET @timer = SYSDATETIME()
<select statement under test>
SET @diff = DATEDIFF(MILLISECOND, @timer, SYSDATETIME())
SET @total = @total + @diff
END
SELECT @total
不过,我得到的是负总数!?
这到底是怎么回事?我会理解以@total = 0
结束;也就是说增量是 <1 毫秒(或者足够接近计时器的分辨率无论如何都报告了这一点(,所以我最终会总结很多 0。
但是,DATEDIFF 可能返回负数似乎
非常麻烦!我进一步检查并确认@diff
变量确实返回-1
甚至-2
。
什么给?
SYSDATETIME
返回精度为 7
位的datetime2
。
您正在将其分配给精度仅为每秒大约 1/300
的 datetime
变量。所以它可以向上舍入(或向下,但向上是这里的原因(。
尝试
DECLARE @SYSDATETIME DATETIME2 = '2017-04-15 14:49:36.001999'
DECLARE @timer DATETIME = @SYSDATETIME;
DECLARE @diff INT = DATEDIFF(MILLISECOND, @timer, @SYSDATETIME);
SELECT @timer AS [@timer],
@diff AS [@diff];
这返回
+-------------------------+-------+
| @timer | @diff |
+-------------------------+-------+
| 2017-04-15 14:49:36.003 | -2 |
+-------------------------+-------+
.001999
四舍五入为 .003
并且跨越两个毫秒边界,因此DATEDIFF(MILLISECOND
在比较舍入和非舍入值时返回-2
。