为什么 SQL Server 中没有“夏令时”时区?

Jer*_*Jer 3 sql-server timezone

我正在将一些 datetimeoffset 列的时间从 UTC 转换为东部时间。我通过命令执行此操作

UPDATE MyTable SET MyColumn = MyColumn AT TIME ZONE 'Eastern Standard Time'
Run Code Online (Sandbox Code Playgroud)

这似乎工作正常(时间提前了 4 小时,现在有 -04:00 偏移量,正是我想要的),但后来我意识到这不是 EST,现在是 EDT。

SELECT * FROM sys.time_zone_info 
Run Code Online (Sandbox Code Playgroud)

给我一个时区列表,但没有“东部夏令时间”,只有“东部标准时间”。有一个“is_current_dst”列似乎是正确的。但据我所知,谈论时区“东部标准时间”是否处于 DST 是没有任何意义的。东部标准时间意味着它不是夏令时。“东部夏令时”的意思是夏令时。对我来说,这似乎是获得一个动物列表,列表中没有“Dog”和“Cat”,只有“Dog”,带有“isCat”标志!

我很困惑为什么时区被称为“东部标准时间”(以及为什么我上面的更新语句将时间转换为东部夏令时间(又名 UTC -04:00)。

时区名称是否不正确,它实际上应该只是“东部时间”之类的内容,并带有标志告诉当前是 EST 还是 EDT?

或者我只是完全困惑?

AMt*_*two 9

时区列表实际上来自对操作系统的 API 调用,但 SQL Server 不会公开所有可用的列/属性。不幸的是,这意味着我们依赖于 Windows 的设计决策,它将东部标准时间和东部夏令时间视为更改名称和 UTC 偏移量的一个时区。

如果您查看 PowerShell 命令的输出Get-TimeZone,您将看到如下内容:

Id                         : Eastern Standard Time
DisplayName                : (UTC-05:00) Eastern Time (US & Canada)
StandardName               : Eastern Standard Time
DaylightName               : Eastern Daylight Time
BaseUtcOffset              : -05:00:00
SupportsDaylightSavingTime : True
Run Code Online (Sandbox Code Playgroud)

但是,如果查看 SQL Server DMV,您将只看到 3 列:

SELECT *
FROM sys.time_zone_info
WHERE name LIKE '%Aus%';
Run Code Online (Sandbox Code Playgroud)

系统时区信息

SQL Server 显示的内容与OS/PowerShell 中的name相对应。StandardNameSQL Server确实知道当前时区是否正在经历夏令时,但它没有...的概念DaylightName......它专门使用StandardName

我最近对此进行了尝试,包括将 PowerShell 中的数据缓存到 SQL Server 中的表中,以便更轻松地将 DST 时区名称映射到 SQL Server 使用的标准时区名称。您仍然需要使用标准名称AT TIME ZONE,但至少可以拥有完整的可用数据集。您可以在这里阅读更多相关内容