首页 > 解决方案 > 为什么 SQL Server 2017 无法识别 AT 时区?

问题描述

我在 SQL Server 2017 数据库(开发人员版)上运行以下查询。查询执行,但它只显示 getdate 值而没有实际转换。我还看到 SQL 编辑器没有以蓝色完全突出显示“AT TIME ZONE”,这意味着它可能无法识别。请问有什么想法吗?

SELECT 
    GETDATE() AT TIME ZONE 'Central Europe Standard Time' as CET,
    GETDATE() AT TIME ZONE 'Cuba Standard Time' as 'Cuba Time'

PS:我检查了时区的定义和拼写是否正确

SELECT * FROM sys.time_zone_info 

标签: timezonesql-server-2017

解决方案


似乎问题在于您对如何AT TIME ZONE使用datetime数据类型(即GETDATE()返回的内容)的误解。采取以下措施:

DECLARE @DT datetime = '2020-01-17T16:39:01.123';

SELECT @DT AT TIME ZONE 'Central Europe Standard Time' as CET,
       @DT AT TIME ZONE 'Cuba Standard Time' as [Cuba Time];

这将返回以下内容:

CET                                Cuba Time
---------------------------------- ----------------------------------
2020-01-17 16:39:01.123 +01:00     2020-01-17 16:39:01.123 -05:00

@DT 请注意,时间与时区以外的时间相同。这是因为datetime时区不可知;它不知道存在。结果,时区只是简单地“添加”到值中。

但是,如果你使用 a datetimeoffset,你会得到你期望的结果:

DECLARE @DT datetimeoffset(0) = '2020-01-17T16:39:01.123';

SELECT @DT AT TIME ZONE 'Central Europe Standard Time' as CET,
       @DT AT TIME ZONE 'Cuba Standard Time' as [Cuba Time];

回报:

CET                                Cuba Time
---------------------------------- ----------------------------------
2020-01-17 17:39:01 +01:00         2020-01-17 11:39:01 -05:00

在您的情况下,这意味着您需要使用SYSDATETIMEOFFSET

SELECT SYSDATETIMEOFFSET() AT TIME ZONE 'Central Europe Standard Time' as CET,
       SYSDATETIMEOFFSET() AT TIME ZONE 'Cuba Standard Time' as [Cuba Time];

对我来说,当我写下这个答案时,它会返回以下内容:

CET                                Cuba Time
---------------------------------- ----------------------------------
2020-01-17 17:43:55.5596303 +01:00 2020-01-17 11:43:55.5596303 -05:00

推荐阅读