如何在SQL中获取过去12个月每日指定时间窗口并统计对应数值
跨12个月自定义日窗口数据聚合实现方案
以下方案适配你使用的SQL Server语法,和你提供的单日查询逻辑完全兼容:
- 核心改造逻辑:以5点作为单日统计的分界点,把每条数据的
startdate减去5小时,得到的日期即可对应到所属的统计窗口基准,再按该基准分组即可批量完成全周期的窗口求和。 - 可直接运行的SQL示例(替换求和字段即可):
SELECT -- 生成当前数据所属窗口的起止时间 SMALLDATETIMEFROMPARTS( YEAR(DATEADD(HOUR, -5, startdate)), MONTH(DATEADD(HOUR, -5, startdate)), DAY(DATEADD(HOUR, -5, startdate)), 5, 0 ) AS window_start, SMALLDATETIMEFROMPARTS( YEAR(DATEADD(HOUR, -5, startdate)), MONTH(DATEADD(HOUR, -5, startdate)), DAY(DATEADD(HOUR, -5, startdate)) + 1, 5, 0 ) AS window_end, SUM(需要汇总的数值字段) AS total_value -- 替换为你实际要求和的字段名 FROM TableX WHERE -- 筛选范围:从当前时间往前推12个月的最早窗口,到今日最新窗口截止 startdate >= DATEADD(YEAR, -1, SMALLDATETIMEFROMPARTS(YEAR(GETDATE()), MONTH(GETDATE()), DAY(GETDATE()), 5, 0)) AND enddate <= SMALLDATETIMEFROMPARTS(YEAR(GETDATE()), MONTH(GETDATE()), DAY(GETDATE()), 5, 0) GROUP BY YEAR(DATEADD(HOUR, -5, startdate)), MONTH(DATEADD(HOUR, -5, startdate)), DAY(DATEADD(HOUR, -5, startdate)) ORDER BY window_start
逻辑验证说明:例如时间
2021-11-15 04:59:59减去5小时后得到2021-11-14 23:59:59,会被归类到2021-11-14 05:00~2021-11-15 05:00窗口,和你原单日查询的规则完全匹配。
- 注意事项:如果数据时间带时区,需要先统一转换为和
GETDATE()一致的时区再做计算,避免窗口偏移错误;不需要返回窗口起止时间的话,GROUP BY部分可以简化为CAST(DATEADD(HOUR, -5, startdate) AS DATE),写法更简洁。
内容的提问来源于stack exchange,提问作者WhosWho
相关产品推荐
相关产品推荐

