使用 CAST 和 GETUTCDATE() 在 SQL 中声明变量...最有效的方法是什么?

Declaring a variable in TSQL using CAST and GETUTCDATE() ... What is the most efficient way?

如果我使用:

declare @CurrentDate as date = cast(getutcdate() at time zone 'utc' at time zone 'Pacific Standard Time' as date)

CAST 是在我每次调用变量时执行,还是仅在初始声明语句中执行?

getutcdate() 和周围的 cast() 仅在您首次分配给 @CurrentDate 变量时调用。变量是 ,不是函数。您创建具有特定类型的变量,并为其分配该类型的特定值。

但是,@CurrentVariable 类型 Date... 而不是 DateTime。不是 DateTime2。不是 DateTimeOffset。这意味着该变量仅包含 Date 信息。没有时间部分,因此,对于今天,分配的 2019-03-29 值将继续全天有效。

UTC 日期很快就会变成 2019-03-30。这将在美国任何地方发生之前很久就发生在英国(或具有正 UTC 偏移量的地方)。即便如此,变量中的值仍将保持 2019-30-29

真正令人困惑的是,当您在日期值与当地时间不同的位置分配变量时,转换发生在程序仍然 运行 时。变量 中的值永远不会改变 ,除非你再次赋值给它......但是对该值含义的预期确实改变了。