2

首先,我已经解决了我遇到的实际问题,方法是使用 datetime2,并在 MICROSECOND 范围内进行 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.

是什么赋予了?

4

1 回答 1

2

SYSDATETIME返回精度为数字的datetime2a 。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返回。-2

于 2017-04-15T13:59:54.940 回答