在SQL Server中将GETDATE()与存储的GETDATE()进行比较时出现错误结果

7
我希望结果始终为1:
DECLARE @x datetime2
SELECT @x=GETDATE()
SELECT CASE WHEN @x>GETDATE() THEN 0 ELSE 1 END

但有时它是1,有时却是0。这是怎么可能的呢?


微秒可能因服务器速度而异。 - Arun Prasad E S
2
作为一个经验法则,假设没有两个事件会在完全相同的时间发生... - Mitch Wheat
我期望结果始终为0。 - Joel Coehoorn
请仔细查看代码。 当您得到0时,这意味着第一个GETDATE()的值大于第二个GETDATE()的值。 这是不可能的。 - csname1910
1个回答

10

代码执行需要时间。有时,在第二行和第三行之间会发生一个时钟周期,但是有时(通常情况下)不会。在后一种情况(没有时钟周期),@x 仍然等于第三行中 GETDATE() 的值(而非大于该值),因此最终结果为 0。起初让我惊讶的是你从来没有看到过 1。当发生时钟周期时,@x 现在应该小于 第3行的新的 GETDATE() 值,但您将仍然看到 0

但是,运行此代码会更加清晰:

DECLARE @x datetime2
SELECT @x=GETDATE()
SELECT @x, GETDATE(), CASE WHEN @x>GETDATE() THEN 0 ELSE 1 END

现在我们可以更清晰地看到正在发生的事情。这是我机器上的一个示例结果:

2018-01-19 23:32:21.3833333   |  2018-01-19 23:32:21.383   |    1

啊啊啊...@x是一个比旧的datetime更精确的datetime2。你可以在GETDATE()的文档中看到它返回的是datetime而不是datetime2。因此,在这两个值之间存在一些舍入误差。

对于0的值,我运行了修改后的代码30或40次(按F5进行刷新),所有我看到的0都是这样的:

2018-01-19 23:36:29.0366667   |   2018-01-19 23:36:29.037   |   0

第二列最后一位是7,而第一列有连续的6,并以圆形7结束,这是我的问题所在。

仍有一件事让我困惑。 GETDATE() 函数返回一个 datetime 值,但它以某种方式将 datetime2 精度分配给 @x。 我只希望看到始终与原始 GETDATE() 结果匹配的额外零。


3
使用SYSDATETIME()代替GETDATE()将返回具有与@x相同精度的DATETIME2数据类型。 - marc_s
@csname1910 的回答确实很好,请考虑采纳它。 - Gilles Gouaillardet

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接