将CURRENT_TIMESTAMP从UTC转换为EST

时间:2019-07-31 13:41:52

标签: sql tsql azure-sql-database datetimeoffset

我试图在查询开始时声明一个datetime变量,该变量保存查询的运行时间。我正在拉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  

2 个答案:

答案 0 :(得分:0)

您可以尝试以下操作:

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

答案 1 :(得分:0)

简短版本

使用一个:

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

  

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

我怀疑服务器的时区为UTC,这意味着SWITCHOFFSET必须在EST时间增加 4小时才能获得正确的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