我正在将一些 datetimeoffset 列的时间从 UTC 转换为东部时间。我正在通过命令执行此操作
UPDATE MyTable SET MyColumn = MyColumn AT TIME ZONE 'Eastern Standard Time'
这似乎工作正常(时间提前 4 小时移动,现在有一个 -04:00 的偏移量,正是我想要的),但后来我意识到这不是 EST,它现在是 EDT。
SELECT * FROM sys.time_zone_info
给我一个时区列表,但没有“东部夏令时间”,只有“东部标准时间”。有一列“is_current_dst”似乎是正确的。但据我所知,谈论“东部标准时间”时区是否在 DST 没有任何意义。东部标准时间意味着它不是夏令时。“东部夏令时间”是指夏令时。对我来说,这似乎是获取动物列表,而不是列表中的“狗”和“猫”,只有“狗”,带有“isCat”标志!
我对为什么将时区称为“东部标准时间”感到困惑(以及为什么我上面的更新语句将时间转换为东部夏令时间(又名 UTC -04:00)。
时区的名称是否不正确,它应该只是类似于“东部时间”的标志,表明它当前是美国东部时间还是美国东部时间?
还是我完全糊涂了?
时区列表实际上来自对操作系统的 API 调用,但 SQL Server 并未公开所有可用的列/属性。不幸的是,这意味着我们依赖于 Windows 的设计决策,它将东部标准时间和东部夏令时间视为一个更改名称和 UTC 偏移量的时区。
如果您查看 PowerShell 命令的输出
Get-TimeZone
,您会看到如下内容:但是,如果您查看 SQL Server DMV,您只会看到 3 列:
SQL Server 显示的
name
内容对应于StandardName
来自 OS/PowerShell 的内容。SQL Server 确实知道当前是否是当前正在经历夏令时的时区,但它没有...的概念DaylightName
...它专门使用StandardName
我最近玩过这个,包括将数据从 PowerShell 缓存到 SQL Server 中的表中,以便更容易地将 DST 时区名称映射到 SQL Server 使用的标准时区名称。您仍然需要使用标准名称
AT TIME ZONE
,但至少可以使用完整的数据集。您可以在此处阅读更多相关信息