系统时间倒退



首先,我已经解决了我遇到的实际问题,通过使用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/300datetime 变量。所以它可以向上舍入(或向下,但向上是这里的原因(。

尝试

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

相关内容

  • 没有找到相关文章

最新更新