SQL Server中结合sys.time_zone_info编写Case语句转换UTC到EST的问题排查
修复UTC转带夏令时的EST时间的SQL语句错误
原SQL语句存在两个核心问题:
- CASE的WHEN条件中使用
SELECT *返回整行数据,无法直接作为布尔判断依据 - 子查询未明确返回单个布尔值,不符合CASE条件的语法要求
修复后的兼容原逻辑写法
SELECT CN.CreateDate, CASE WHEN (SELECT TOP 1 ISNULL(TZI.is_currently_dst, 0) FROM sys.time_zone_info TZI WHERE TZI.name = 'US Eastern Standard Time') = 0 THEN DATEADD(HOUR, -5, CN.CreateDate) ELSE DATEADD(HOUR, -4, CN.CreateDate) END AS CreateDateEST FROM MC_CDCPContactNotes CN
修复说明:
- 将子查询改为返回
is_currently_dst的具体值,确保可以在WHEN中进行数值比较 - 用
TOP 1保证子查询仅返回单个结果(sys.time_zone_info中时区名称唯一)
更优的自动夏令时处理方案
如果需要对历史时间也准确适配夏令时,推荐使用SQL Server原生的AT TIME ZONE函数,无需手动判断偏移量:
SELECT CN.CreateDate, CN.CreateDate AT TIME ZONE 'UTC' AT TIME ZONE 'US Eastern Standard Time' AS CreateDateEST FROM MC_CDCPContactNotes CN
原理说明:
CN.CreateDate AT TIME ZONE 'UTC':将原始UTC时间标记为UTC时区类型- 再次使用
AT TIME ZONE 'US Eastern Standard Time':自动转换为东部时区时间,系统会根据时间点自动识别是否启用夏令时
内容的提问来源于stack exchange,提问作者Dee
相关产品推荐
相关产品推荐

