我试图在查询开始时声明一个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
答案 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_TIMESTAMP
。 CURRENT_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