如何合并T-SQL查询将UTC小时转换为PDT时区?(SQL Server 2014)
解决方案
SQL Server 2014没有内置的AT TIME ZONE时区转换函数(该功能从2016版本开始引入),所以我们需要手动处理PDT时区的偏移逻辑,PDT为UTC-7小时,若需自动识别夏令时切换可参考下方进阶方案。以下是合并后的查询实现:
1. 仅按PDT本地时区小时统计
SELECT DATEPART(HOUR, DATEADD(HOUR, -7, UTC_Time)) AS PDT_Hour, COUNT(*) AS Record_Count FROM YourTable WHERE UTC_Time >= '指定起始日期' AND UTC_Time < '指定结束日期' GROUP BY DATEPART(HOUR, DATEADD(HOUR, -7, UTC_Time)) ORDER BY PDT_Hour;
2. 同时保留UTC小时和PDT小时统计
如果需要同时对比UTC与PDT的小时统计数据,可使用以下查询:
SELECT DATEPART(HOUR, UTC_Time) AS UTC_Hour, DATEPART(HOUR, DATEADD(HOUR, -7, UTC_Time)) AS PDT_Hour, COUNT(*) AS Record_Count FROM YourTable WHERE UTC_Time >= '指定起始日期' AND UTC_Time < '指定结束日期' GROUP BY DATEPART(HOUR, UTC_Time), DATEPART(HOUR, DATEADD(HOUR, -7, UTC_Time)) ORDER BY UTC_Hour;
进阶:自动识别太平洋时区夏令时(PST/PDT切换)
若需要自动根据日期判断是使用PST(UTC-8)还是PDT(UTC-7),可以自定义函数实现夏令时区间判断:
CREATE FUNCTION dbo.GetPacificTimeOffset(@UTCTime DATETIME) RETURNS INT AS BEGIN DECLARE @LocalTime DATETIME = DATEADD(HOUR, -8, @UTCTime); -- 先转换为PST基准时间 -- 计算当年夏令时开始时间:3月第二个周日的2点 DECLARE @DSTStart DATETIME = DATEADD(HOUR, 2, DATEADD(WEEK, 1, DATEADD(DAY, 1-DATEPART(WEEKDAY, '3/1/' + CAST(YEAR(@LocalTime) AS VARCHAR)), '3/1/' + CAST(YEAR(@LocalTime) AS VARCHAR)))); -- 计算当年夏令时结束时间:11月第一个周日的2点 DECLARE @DSTEnd DATETIME = DATEADD(HOUR, 2, DATEADD(WEEK, 0, DATEADD(DAY, 1-DATEPART(WEEKDAY, '11/1/' + CAST(YEAR(@LocalTime) AS VARCHAR)), '11/1/' + CAST(YEAR(@LocalTime) AS VARCHAR)))); RETURN CASE WHEN @LocalTime BETWEEN @DSTStart AND @DSTEnd THEN -7 ELSE -8 END; END;
调用该函数实现自动时区转换的统计:
SELECT DATEPART(HOUR, DATEADD(HOUR, dbo.GetPacificTimeOffset(UTC_Time), UTC_Time)) AS Local_Hour, COUNT(*) AS Record_Count FROM YourTable WHERE UTC_Time >= '指定起始日期' AND UTC_Time < '指定结束日期' GROUP BY DATEPART(HOUR, DATEADD(HOUR, dbo.GetPacificTimeOffset(UTC_Time), UTC_Time)) ORDER BY Local_Hour;
内容的提问来源于stack exchange,提问作者philipgonzales3
相关产品推荐
相关产品推荐

