如何修改SQL语句将太平洋时区日期时间转换为提前8小时的时间
解决方案
原SQL直接拼接日期和时间字符串的方式无法处理跨天的时间计算逻辑,正确的做法是先将日期与时间字段合并为datetime类型完成8小时的偏移计算,再格式化为目标字符串格式。
修改后的SQL语句(兼容全版本SQL Server)
SELECT CONVERT(VARCHAR(10), adjusted_datetime, 101) + ' ' + LTRIM(RIGHT(CONVERT(VARCHAR(26), adjusted_datetime, 109), 14)) AS DATE_AND_START_TIME FROM ( SELECT DATEADD(HOUR, 8, CAST(dbo.S85_CALENDAR_SCHEDULES.cals_date AS DATETIME) + CAST(dbo.S85_CALENDAR_SCHEDULES.cals_start_time AS DATETIME)) AS adjusted_datetime FROM dbo.S85_CALENDAR_SCHEDULES ) AS temp
代码说明
- 合并日期与时间:
CAST(cals_date AS DATETIME) + CAST(cals_start_time AS DATETIME)将分开的日期、时间字段合并为完整的datetime值,为后续时间计算提供基础。 - 偏移8小时:
DATEADD(HOUR, 8, ...)自动处理跨天场景,时间偏移后日期会同步更新。 - 格式化为目标字符串:
CONVERT(VARCHAR(10), adjusted_datetime, 101)生成MM/DD/YYYY格式的日期部分LTRIM(RIGHT(CONVERT(VARCHAR(26), adjusted_datetime, 109), 14))提取并格式化出HH:MI AM/PM的时间部分
示例验证
- 输入
08/07/2023 1:00 PM:合并后时间为2023-08-07 13:00:00,偏移8小时后为2023-08-07 21:00:00,最终输出08/07/2023 9:00 PM - 输入
08/07/2023 8:00 PM:合并后时间为2023-08-07 20:00:00,偏移8小时后为2023-08-08 04:00:00,最终输出08/08/2023 4:00 AM
简化写法(SQL Server 2012+)
如果使用SQL Server 2012及以上版本,可直接用FORMAT函数简化格式化逻辑:
SELECT FORMAT(DATEADD(HOUR, 8, CAST(cals_date AS DATETIME) + CAST(cals_start_time AS DATETIME)), 'MM/dd/yyyy h:mm tt') AS DATE_AND_START_TIME FROM dbo.S85_CALENDAR_SCHEDULES
内容的提问来源于stack exchange,提问作者KLR
相关产品推荐
相关产品推荐

