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