Jer*_* S. 4 sql-server datetime sql-server-2019
正如标题所暗示的那样,我想知道这是否可能,或者您是否遇到过同一 UPDATE 语句中不同 GETDATE() 结果的问题。
我有一个存储过程,它更新包含两个 DateTime 列的记录,其中还有一个 CASE 语句,一般更新如下:
UPDATE A
SET Status = dbo.func('P')
,Time1 = GETDATE()
,Time2 = ISNULL(A.Time2, GETDATE())
,ModifiedOn = GETDATE()
FROM dbo.Table A
WHERE A.ID = @ID
AND A.RowID = @RowID;
Run Code Online (Sandbox Code Playgroud)
我看到 Time2 值稍晚一些,但总是以 3 或 4 的增量增加。这似乎是由于 SQL Server 通过设计将日期时间四舍五入到最接近的 0.000、0.003、0.007 Stack Post Here。
我认为这种差异是由两个 GETDATE() 调用之间的轻微延迟引起的,并且延迟通常会导致一个“滴答声”,因为我只看到 Time2 - Time1 = {-.003, -.004 之间的差异}。
上述查询是否有可能返回两个不同的 GETDATE() 结果?
Pau*_*ite 11
GETDATE是被视为运行时常量的内在函数之一。它在语句启动时评估一次,然后为每一行返回相同的缓存值。
运行时常量的每个实例都单独缓存。因此,每次评估时,每个值都会返回相同的值,但最初缓存的值可能会略有不同。
你有三个这样的例子。
需要明确的是:在您的示例中,存储在Time1中的值在每一行中都是相同的。Time2中存储的值在每一行中都相同。ModifiedOn中存储的值在每一行中都是相同的。Time1、Time2和ModifiedOn中的值可能不同。
如果您希望值始终相同,最安全的方法是将 的值分配GETDATE给变量并在目标语句中使用该变量:
DECLARE
@Now datetime = GETDATE();
UPDATE A
SET [Status] = dbo.func('P'),
Time1 = @Now,
Time2 = ISNULL(A.Time2, @Now),
ModifiedOn = @Now
FROM dbo.[Table] AS A
WHERE
A.ID = @ID
AND A.RowID = @RowID;
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
389 次 |
| 最近记录: |