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

csn*_*910 7 sql sql-server

我希望结果总是1:

DECLARE @x datetime2
SELECT @x=GETDATE()
SELECT CASE WHEN @x>GETDATE() THEN 0 ELSE 1 END
Run Code Online (Sandbox Code Playgroud)

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

Joe*_*orn 10

代码执行需要时间.有时在第二和第三行之间发生嘀嗒,有时(通常)没有.在后一种情况下(没有勾号),@x仍然等于(不大于)GETDATE()第三行中的值,并最终得到0.一开始让我感到惊讶的是你看到的1.当确实发生滴答时,@x现在应该小于GETDATE()第3行中的新值,你仍然会看到0.

但是在运行此代码时更有意义:

DECLARE @x datetime2
SELECT @x=GETDATE()
SELECT @x, GETDATE(), CASE WHEN @x>GETDATE() THEN 0 ELSE 1 END
Run Code Online (Sandbox Code Playgroud)

现在我们可以看到更好的情况.这是我机器上的示例结果:

2018-01-19 23:32:21.3833333   |  2018-01-19 23:32:21.383   |    1
Run Code Online (Sandbox Code Playgroud)

唉唉...... @xdatetime2比旧的更精确datetime的使用GETDATE().你可以在GETDATE()文档中看到它确实返回datetime而不是datetime2.所以我们在两个值之间发生了一些舍入误差.

对于0价值观,我跑了改变码30或40次(命中为刷新F5),和所有的的0的,我看到是这样的:

2018-01-19 23:36:29.0366667   |   2018-01-19 23:36:29.037   |   0
Run Code Online (Sandbox Code Playgroud)

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

有一件事让我感到困惑.该GETDATE()函数返回一个datetime值,但它以某种方式分配datetime2精度@x.我希望看到额外的零,总是与原始GETDATE()结果相匹配.

  • 使用`SYSDATETIME()`而不是`GETDATE()`将返回`DATETIME2`数据类型,其精度与`@ x`相同 (3认同)