我正在执行一些 SQL 选择查询,并希望将我的 UTC 日期时间列转换为本地时间,以便在我的查询结果中显示为本地时间。请注意,我不希望通过代码进行此转换,而是在对我的数据库进行手动和随机 SQL 查询时。
您可以在 SQL Server 2008 或更高版本上执行以下操作:
SELECT CONVERT(datetime, SWITCHOFFSET(CONVERT(datetimeoffset, MyTable.UtcColumn), DATENAME(TzOffset, SYSDATETIMEOFFSET()))) AS ColumnInLocalTime FROM MyTable
你也可以做一些不那么冗长的事情:
SELECT DATEADD(mi, DATEDIFF(mi, GETUTCDATE(), GETDATE()), MyTable.UtcColumn) AS ColumnInLocalTime FROM MyTable
无论您做什么, 都不要 使用-减去日期,因为该操作不是原子的,并且由于系统日期时间和在不同时间检查的本地日期时间之间的竞争条件(即非原子地),您有时会得到不确定的结果.
-
请注意,此答案未考虑 DST。如果您想包含 DST 调整,另请参阅以下 SO 问题:
如何在 SQL Server 中创建夏令时开始和结束函数