SYSDATETIME倒退

时间:2017-04-15 11:21:10

标签: sql sql-server timing datediff sysdatetime

首先,我已经解决了我遇到的实际问题,转移到使用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

是什么给出了?

1 个答案:

答案 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