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()),[时间戳]))
有谁知道如何让这个工作?
谢谢
首先,了解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]字段是 adatetime或datetime2,并且它是基于 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)
另外,不要被时区标识符中的“标准”一词混淆。该值涵盖标准时间和夏令时,适用于美国和加拿大的太平洋时区。
| 归档时间: |
|
| 查看次数: |
17172 次 |
| 最近记录: |