SQL Server中GETDATE()等时间函数返回值一致性规则问询
SQL Server 时间函数返回值一致性规则说明
核心一致性边界
- 单条语句的整个执行生命周期内,所有对
GETDATE()等时间函数的调用返回值完全一致:无论是同一表达式内的多次调用、同一条DML语句中针对单行/多行的不同表达式调用,还是语句执行过程中触发的所有触发器内的调用,都会得到相同的时间值,不存在跨精度临界值返回不同结果的可能。 - 仅当执行上下文切换到独立执行批次、用户主动调用的独立存储过程/自定义函数时,时间函数才会重新计算返回值,和外层语句的调用结果可能存在差异。
常见疑问解答
你提到的当月第一天计算表达式:DATEADD(day, 1-DATEPART(day, GETDATE()), GETDATE())
是完全安全的,两次GETDATE()调用属于同一条表达式的执行上下文,必然返回相同值,即使恰好跨月末月初的时间边界执行也不会出现非预期结果。
跨上下文一致性规避方案
如果需要保证跨存储过程、跨批次的时间一致,可提前将时间值赋值给变量,后续逻辑、参数传递都复用该变量即可:
DECLARE @CurrDateTime DATETIME = GETDATE(); -- 后续所有逻辑都引用@CurrDateTime,调用存储过程时将其作为参数传入
上述所有规则同样适用于SYSDATETIME()、GETUTCDATE()、SYSDATETIMEOFFSET()等所有SQL Server系统时间获取函数。
内容的提问来源于stack exchange,提问作者Kevin Martin
相关产品推荐
相关产品推荐

