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