我正在执行一些SQL select查询,并希望将UTC datetime列转换为本地时间,以便在查询结果中显示为本地时间.请注意,我不希望通过代码进行这种转换,而是在对数据库执行手动和随机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

无论你做什么,do not都会使用-来减go 日期,因为这个操作不是原子的,而且由于系统日期时间和本地日期时间在不同时间(即非原子)被判断的竞争条件,有时会得到不确定的结果.

请注意,这个答案没有考虑DST.如果您想包括DST调整,请参见以下问题:

How to create Daylight Savings time Start and End function in SQL Server

Sql相关问答推荐

需要解决办法通过传递过程参数而不是声明表行类型来声明表类型

SQL:创建查询以添加减少的总数

如何重用表值用户定义函数调用的结果?

PostgreSQL:获取每家店铺收入最高的员工

如何在SQL Server中列出从当前月份开始的过go 10年中的月份

如何在幂函数中正确使用Power()和Exp()

计算分段的总权重

有没有办法在Postgres中存储带有时区的时间戳,而不将其转换为UTC

SQL计数条目大于日期,包括交叉表中的零

重用传递给 node 的参数-postgres upsert查询

我可以在SQLite3中使用BLOB作为主键吗?

动态组/转置

在Athena中使用regexp提取括号前的字符串值

存储过程太慢

MySQL中的递归查询邻接表深度优先?

如何筛选 GROUP BY 结果? HAVING 没有产生预期的结果

计算 PostgreSQL 中的平均会话长度

存储过程 - 动态 SQL 中不同列值的计数

每组跨行曲折?

PostgreSQL Select 具有两列的自引用