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?
或者我只是完全困惑?
时区列表实际上来自对操作系统的 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,但至少可以拥有完整的可用数据集。您可以在这里阅读更多相关内容