首先,我已经解决了我遇到的实际问题,转移到使用datetime2,并在MICROSECOND范围内进行DATEDIFFing。但我仍然对我所看到的行为感到惊讶,所以......
我正在尝试使用某些SQL来诊断一个perf问题,并且我有像这样循环的代码来测试它:
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
。
是什么给出了?
答案 0 :(得分:2)
SYSDATETIME
会返回datetime2
,其精确度为7
。
您将其分配给datetime
变量,其精度仅为每秒约1/300
。所以它可以被四舍五入(或者向下但是向上是原因)。
尝试
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
。