You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

周日为周起始的SQL统计需求:按周一至周日求和

解决方案:自定义周起始与统计范围的SQL实现

绝对可以实现!这种周起始规则(周日为起始)和统计范围(周一至周日)不一致的需求,只要调整日期映射的逻辑就能轻松搞定。核心思路是:先为每个日期绑定一个以周日为起始的周标识,再将该标识映射到对应的「周一至周日」统计区间,最后按周分组求和。

核心逻辑拆解

  • 给任意日期计算它所属的「周起始周日」:
    • 如果日期是周日,周起始就是它本身
    • 如果日期是周一至周六,周起始是它之前的最近一个周日
  • 该周对应的统计区间为:周起始周日的下周一 至 周起始周日的下一个周日(即周起始周日+7天)
  • 按周起始周日分组,统计区间内的数据总和

各主流数据库实现示例

MySQL

-- 计算每个日期的周标识与统计区间,并求和
SELECT
  -- 用周日作为周的唯一标识
  DATE_SUB(d, INTERVAL (WEEKDAY(d) + 1) % 7 DAY) AS week_identifier_sunday,
  -- 统计区间:周一至周日
  DATE_ADD(DATE_SUB(d, INTERVAL (WEEKDAY(d) + 1) % 7 DAY), INTERVAL 1 DAY) AS stats_start,
  DATE_ADD(DATE_SUB(d, INTERVAL (WEEKDAY(d) + 1) % 7 DAY), INTERVAL 7 DAY) AS stats_end,
  SUM(your_value_column) AS total_sum
FROM your_table
-- 筛选你需要的目标周(比如2018-02-25所属周的统计区间)
WHERE d BETWEEN '2018-02-26' AND '2018-03-04'
GROUP BY week_identifier_sunday, stats_start, stats_end;

说明:WEEKDAY(d)返回0=周一,6=周日;通过(WEEKDAY(d)+1)%7计算需要回溯的天数,得到最近的周日作为周标识。

PostgreSQL

-- 计算每个日期的周标识与统计区间,并求和
SELECT
  (d - (EXTRACT(DOW FROM d)::INT) * INTERVAL '1 day')::DATE AS week_identifier_sunday,
  ((d - (EXTRACT(DOW FROM d)::INT) * INTERVAL '1 day') + INTERVAL '1 day')::DATE AS stats_start,
  ((d - (EXTRACT(DOW FROM d)::INT) * INTERVAL '1 day') + INTERVAL '7 day')::DATE AS stats_end,
  SUM(your_value_column) AS total_sum
FROM your_table
WHERE d BETWEEN '2018-02-26' AND '2018-03-04'
GROUP BY week_identifier_sunday, stats_start, stats_end;

说明:EXTRACT(DOW FROM d)返回0=周日,1=周一…6=周六;减去对应天数得到最近的周日。

SQL Server

-- 先设置周日为一周的第一天(确保DATEPART逻辑正确)
SET DATEFIRST 7;

SELECT
  DATEADD(DAY, 1 - DATEPART(DW, d), d) AS week_identifier_sunday,
  DATEADD(DAY, 2 - DATEPART(DW, d), d) AS stats_start,
  DATEADD(DAY, 8 - DATEPART(DW, d), d) AS stats_end,
  SUM(your_value_column) AS total_sum
FROM your_table
WHERE d BETWEEN '2018-02-26' AND '2018-03-04'
GROUP BY DATEADD(DAY, 1 - DATEPART(DW, d), d), DATEADD(DAY, 2 - DATEPART(DW, d), d), DATEADD(DAY, 8 - DATEPART(DW, d), d);

说明:DATEPART(DW, d)在DATEFIRST 7下返回1=周日,2=周一…7=周六;通过1-DATEPART(DW,d)计算回溯天数得到周起始周日。

按照这个逻辑,你示例中2018-02-25所属周的统计区间(2018-02-26至2018-03-04)内的数据总和会被正确计算为2468。

内容的提问来源于stack exchange,提问作者unicorn

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.20 07:50:04