【问题标题】:Convert CURRENT_TIMESTAMP from UTC to EST将 CURRENT_TIMESTAMP 从 UTC 转换为 EST
【发布时间】:2019-07-31 13:41:52
【问题描述】:

我试图在我的查询开始时声明一个日期时间变量来保存查询的运行时间。我正在拉 UTC 时间,但我需要 EST。

我试过下面的代码:

DECLARE @RunDate as datetimeoffset  
SET @RunDate = CURRENT_TIMESTAMP at time zone 'Eastern Standard Time'  

DECLARE @RunDateEST as datetime  
SET @RunDateEST = CONVERT(DATETIME, SWITCHOFFSET(@RunDate, DATEPART(tz, SYSDATETIMEOFFSET())))  

SELECT @RunDate as runDate, @RunDateEST as runDateEST  

但收到以下信息:

Actual Result (adds 4 hours to UTC time):  
    runDate:       2019-07-31 13:34:01.2770000 -04:00  
    runDateEST:    2019-07-31 17:34:01.277  

有谁知道我的查询缺少什么可以实现以下结果?

Expected Result (subtract 4 hours from UTC time):  
    runDate:        2019-07-31 13:34:01.2770000 -04:00  
    runDateEST:     2019-07-31 09:34:01.277  

【问题讨论】:

    标签: sql tsql azure-sql-database datetimeoffset


    【解决方案1】:

    短版

    使用单个:

    select cast(SYSDATETIMEOFFSET() at time zone 'Eastern Standard Time' as datetime)
    

    说明

    问题在于首先使用CURRENT_TIMESTAMPCURRENT_TIMESTAMP 等价于 GETDATE()。它返回一个本地datetime,没有任何偏移指示。 这意味着

    select  CURRENT_TIMESTAMP at time zone 'Eastern Standard Time'
    

    等价于

    select  GETDATE() at time zone 'Eastern Standard Time'
    

    在这种情况下,AT TIME ZONE 只是附加偏移量而不进行任何转换。它不能做任何事情,因为它不知道源偏移量是什么。这是文档中的clearly explained

    将 inputdate 转换为目标时区中相应的 datetimeoffset 值。当 inputdate 没有提供偏移信息时,该函数应用时区的偏移量,假设 inputdate 在目标时区。如果 inputdate 作为 datetimeoffset 值提供,则 AT TIME ZONE 子句使用时区转换规则将其转换为目标时区。

    我怀疑服务器的时区是 UTC,这意味着 SWITCHOFFSET 必须添加 4 小时到 EST 时间才能获得正确的 UTC 时间。

    要解决此问题,请使用 SYSDATETIMEOFFSET() 而不是 GETDATE/CURRENT_TIMESTAMP :

    select SYSDATETIMEOFFSET() at time zone 'Eastern Standard Time' 
    

    这会返回:

    2019-08-01 07:05:23.5447068 -04:00
    

    要去除偏移量,请将结果转换为 datetime

    select cast(SYSDATETIMEOFFSET() at time zone 'Eastern Standard Time' as datetime)
    

    这会返回:

    2019-08-01 07:05:23.543
    

    【讨论】:

      【解决方案2】:

      您可以尝试以下方法:

      DECLARE @RunDateUTC as datetimeoffset  
      SET @RunDateUTC = CURRENT_TIMESTAMP AT TIME ZONE 'UTC' 
      
      DECLARE @RunDateEST as datetime  
      
      SET @RunDateEST = CONVERT(DATETIME, @RunDateUTC AT TIME ZONE 'Eastern Standard Time')
      
      SELECT @RunDateUTC,@RunDateEST
      

      【讨论】:

        猜你喜欢
        • 2019-06-18
        • 2021-10-27
        • 2012-06-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-04-11
        • 2023-04-07
        相关资源
        最近更新 更多