SYSDATETIME 倒退

SYSDATETIME going backwards

首先,我已经解决了我遇到的实际问题,方法是转而使用 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 可能 return negative!

似乎有很大的问题

我进一步检查并确认 @diff 变量确实 returning -1 甚至 -2.

什么给了?

SYSDATETIME returns 具有 7 位数精度的 datetime2

您将其分配给一个 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]; 

这个returns

+-------------------------+-------+
|         @timer          | @diff |
+-------------------------+-------+
| 2017-04-15 14:49:36.003 |    -2 |
+-------------------------+-------+

.001999 舍入为 .003 并且跨越两个毫秒边界,因此在比较舍入值和非舍入值时 DATEDIFF(MILLISECOND returns -2