【问题标题】:Declaring a variable in TSQL using CAST and GETUTCDATE() ... What is the most efficient way?使用 CAST 和 GETUTCDATE() 在 SQL 中声明变量...最有效的方法是什么?
【发布时间】:2019-03-29 19:35:48
【问题描述】:

如果我使用:

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

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

【问题讨论】:

  • 强制转换发生在初始化时。 currentdate 是日期类型。该变量不转换数据,它只能分配数据。构建一个函数将字符串数据转换为通用时间。

标签: sql-server tsql declare getdate


【解决方案1】:

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

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

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

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

【讨论】:

  • 这是我假设但想检查的。感谢您的快速响应。
  • 感谢您的解释。对于我使用它的目的,让价值保持不变并不会让我太担心。它只是在中午运行的快速查询中使用。
猜你喜欢
  • 1970-01-01
  • 2016-05-19
  • 1970-01-01
  • 2019-02-10
  • 2011-12-01
  • 2016-03-31
  • 2016-06-03
  • 1970-01-01
  • 2016-09-18
相关资源
最近更新 更多