SQL Server 2012 等效于 AT TIME ZONE 功能

Cad*_*oux 5 sql-server sql-server-2012 timezone datetime

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']
;
Run Code Online (Sandbox Code Playgroud)

至少在 6 月,前两列中的 tzoffsets 与后两列不同,因为“标准”时区在 12 月的偏移量与 6 月不同。

AMt*_*two 6

这是日历表的一个很好的用例。

Aaron Bertrand 在这里深入介绍了这个场景。整篇文章非常深入,可以在此处的答案中进行复制,但我会尝试进行总结。

本质上,您创建了一个日期表,并在元数据中包含您关注的所有年份的夏令时开始/结束。然后,您可以使用这些日期将时间从您的时区转换为 UTC,反之亦然。一旦您有了要加入的日历表,确定您是处于标准时间还是夏令时突然变得微不足道,而无需跳过箍。

在您的用例中,您可以通过偏移量简单地转换为 UTC,然后使用 Aaron 的日历表方法和附带的函数转换回本地时间。

就风格而言,我也非常喜欢总是以 UTC 时间存储日期时间值以进行规范数据存储。这些时区和夏令时对话非常复杂,如果您始终以 UTC 格式存储数据,则可以确保您拥有良好的数据,而只需与显示错误作斗争。如果您在存储数据的方式上存在错误,则修复该错误需要追溯修复数据,这要复杂得多。