在SQL查询输出中将UTC时间转换为LOCAL

时间:2017-12-04 22:44:10

标签: sql-server tsql timezone

我正在努力使用SQL查询 - 在select输出中使用UTC时间转换的基本select语句。我已经做了很多搜索,并通过所有这些已经到达以下查询,但它似乎并不适合我。

Func

这一行是神奇应该发生的地方,但我获得了Timestamp列值的精确匹配,因此根本没有发生转换:

  

(SELECT   DATEADD(微差,DATEDIFF(微差,GETUTCDATE(),GETDATE()),时间戳))

有谁知道如何使这个工作?

由于

1 个答案:

答案 0 :(得分:4)

首先,要了解getdate()返回服务器的本地日期和时间 - 而不是运行查询的人。如果服务器的时区设置为UTC,那么它确实会返回UTC时间。

由于您在SQL 2016上运行,并且您要求将UTC时间转换为太平洋时间,我建议您使用内置的AT TIME ZONE语句,如下所示:

SELECT [Id]
      ,[BaseSource]
      ,[Source]
      ,[Output]
      ,[SessionId]
      ,[Timestamp]
      ,[Timestamp] AT TIME ZONE 'UTC' AT TIME ZONE 'Pacific Standard Time' AS LocalTime
FROM [MYDB].[dbo].[SystemOutput]
ORDER BY [Timestamp] DESC

注意,上面假设[Timestamp]字段是datetimedatetime2,并且它是基于UTC的值。第一个AT TIME ZONE断言给定值是UTC,结果是datetimeoffset。第二个AT TIME ZONE然后从UTC转换为太平洋时间。

如果该字段已经是datetimeoffset类型,则查询更简单:

SELECT [Id]
      ,[BaseSource]
      ,[Source]
      ,[Output]
      ,[SessionId]
      ,[Timestamp]
      ,[Timestamp] AT TIME ZONE 'Pacific Standard Time' AS LocalTime
FROM [MYDB].[dbo].[SystemOutput]
ORDER BY [Timestamp] DESC

此外,不要被“#34; Standard"”这个词弄糊涂。在时区标识符中。该值涵盖标准时间和日光时间,适用于美国和加拿大的太平洋时区。