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 月不同。
这是日历表的一个很好的用例。
Aaron Bertrand 在这里深入介绍了这个场景。整篇文章非常深入,可以在此处的答案中进行复制,但我会尝试进行总结。
本质上,您创建了一个日期表,并在元数据中包含您关注的所有年份的夏令时开始/结束。然后,您可以使用这些日期将时间从您的时区转换为 UTC,反之亦然。一旦您有了要加入的日历表,确定您是处于标准时间还是夏令时突然变得微不足道,而无需跳过箍。
在您的用例中,您可以通过偏移量简单地转换为 UTC,然后使用 Aaron 的日历表方法和附带的函数转换回本地时间。
就风格而言,我也非常喜欢总是以 UTC 时间存储日期时间值以进行规范数据存储。这些时区和夏令时对话非常复杂,如果您始终以 UTC 格式存储数据,则可以确保您拥有良好的数据,而只需与显示错误作斗争。如果您在存储数据的方式上存在错误,则修复该错误需要追溯修复数据,这要复杂得多。
归档时间: |
|
查看次数: |
167 次 |
最近记录: |