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

Nug*_*ugs 1 t-sql sql-server timezone

我正在努力处理 SQL 查询 - 一个基本的选择语句,在选择输出中带有 UTC 时间转换。我已经对此进行了大量搜索,并通过所有这些搜索得出了以下查询,但它似乎对我不起作用。

SELECT [Id]
      ,[BaseSource]
      ,[Source]
      ,[Output]
      ,[SessionId]
      ,[Timestamp]
      ,(SELECT DATEADD(MILLISECOND,DATEDIFF(MILLISECOND,getutcdate(),GETDATE()),[Timestamp])) as LocalTime
  FROM [MYDB].[dbo].[SystemOutput]
  ORDER BY [Timestamp] DESC
Run Code Online (Sandbox Code Playgroud)

这一行是魔法应该发生的地方,但我得到了 Timestamp 列值的精确匹配,所以根本没有发生转换:

(SELECT DATEADD(MILLISECOND,DATEDIFF(MILLISECOND,getutcdate(),GETDATE()),[时间戳]))

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

谢谢

Mat*_*int 8

首先,了解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
Run Code Online (Sandbox Code Playgroud)

请注意,以上假设该[Timestamp]字段是 adatetimedatetime2,并且它是基于 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
Run Code Online (Sandbox Code Playgroud)

另外,不要被时区标识符中的“标准”一词混淆。该值涵盖标准时间和夏令时,适用于美国和加拿大的太平洋时区。