SQL Server 2012 中是否有办法获取特定日期/时间的服务器时区?在 SQL Server 2016 中,您有AT TIME ZONE
,但在 2012 年不可用。我有一个datetimeoffset
,我需要将其转换为服务器的时区(在该日期),然后再将其截断为datetime
. SWITCHOFFSET
仅当您知道偏移量时才有效,但对于每年更改两次时区的服务器,偏移量将来回翻转。
此查询说明了 SQL Server 2016 中的功能:
SELECT @@SERVERNAME AS [SERVERNAME]
, GETDATE() AT TIME ZONE 'Central Standard Time' AS [GETDATE() AT TIME ZONE 'Central Standard Time']
, GETDATE() AT TIME ZONE 'Eastern Standard Time' AS [GETDATE() AT TIME ZONE 'Eastern Standard Time']
, DATEADD(MONTH, -6, GETDATE()) AT TIME ZONE 'Central Standard Time' AS [DATEADD(MONTH, -6, GETDATE()) AT TIME ZONE 'Central Standard Time']
, DATEADD(MONTH, -6, GETDATE()) AT TIME ZONE 'Eastern Standard Time' AS [DATEADD(MONTH, -6, GETDATE()) AT TIME ZONE 'Eastern Standard Time']
;
至少在 6 月,前两列中的 tzoffset 与后两列不同,因为“标准”时区在 12 月的偏移量与 6 月不同。
这是日历表的一个很好的用例。
Aaron Bertrand 在这里深入介绍了这个确切的场景。整篇文章非常深入,可以在此处复制答案,但我会尝试总结一下。
实质上,您创建了一个日期表,并在元数据中包含您关心的所有年份的夏令时的开始/结束。然后,您可以使用这些日期将时间从您的时区转换为 UTC,反之亦然。一旦您有了要加入的日历表,就无需费力地确定您是处于标准时间还是夏令时间,就变得微不足道了。
在您的用例中,您可以通过偏移量简单地转换为 UTC,然后使用 Aaron 的日历表方法和随附的函数转换回本地时间。
作为风格问题,我也非常喜欢始终将日期时间值存储在 UTC 以进行规范数据存储。这些时区和夏令时对话非常复杂,如果您始终以 UTC 存储数据,则可以确保您拥有良好的数据,并且只需要与显示错误作斗争。如果您在存储数据方面存在错误,则修复需要追溯修复数据,这要复杂得多。