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

时间:2018-01-20 05:21:27

标签: sql sql-server

我希望结果总是1:

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

但它有时是1,有时是0。 怎么可能?

1 个答案:

答案 0 :(得分:10)

执行代码需要时间。有时在第二和第三行之间发生嘀嗒,有时(通常)没有。在后一种情况下(无勾号),-ar 48000 -ac 2仍然等于(不大于)第三行中的@x值,最后得到GETDATE()。一开始让我感到惊讶的是你见过0。当确实发生勾选时,1现在应该小于第3行中的新@x值,您仍然会看到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,其精度高于datetime2使用的旧版datetime。您可以在documentation for GETDATE()中看到它确实返回GETDATE()而不是datetime。所以我们在这两个值之间会出现一些舍入错误。

对于datetime2值,我将更改的代码运行了30或40次(按F5进行刷新),并且0全部我看到了这样:

0

第二列中的最后一位数字为7,第一列重复6位,末尾为圆形7位。

有一件事让我感到困惑。 2018-01-19 23:36:29.0366667 | 2018-01-19 23:36:29.037 | 0 函数返回GETDATE()值,但不知何故,它会将datetime精度赋给datetime2。我希望看到额外的零,它始终与原始@x结果匹配。