如何通过OFFSET调整SQL中按周统计数据的起始周?
- 内容介绍
- 相关推荐
本文共计1117个文字,预计阅读时间需要5分钟。
MySQL 的 `WEEK()` 函数默认是根据周内或周日作为起点(取决于 `mode` 参数),但是无法直接指定每周三为起点这类任意偏移的起点。必须手动调整日期来实现:
比如要让每周三为起点(即:周三=第1天,周二=第7天),先用DATE_SUB(dt, INTERVAL 2 DAY)把周三变成周一,再用WEEK(..., 1)按周一为起点计算周编号,就能对齐。
-
WEEK(dt, 1):以周一为周首、周日为周尾,第1周是包含1月4日的那一周 - 若想让周三为起点,偏移量 =
(WEEKDAY('2024-01-03') - 0)→ 周三的WEEKDAY()值是2,目标基准是周一(0),所以OFFSET = 2 - 实际分组SQL写法:
GROUP BY YEARWEEK(DATE_SUB(created_at, INTERVAL 2 DAY), 1) - 注意
YEARWEEK()返回的是类似202405这样的整数,跨年时比单纯WEEK()更安全
PostgreSQL里用EXTRACT(ISODOW)和OFFSET算周边界
PostgreSQL没有内置“任意起始日的周”函数,但EXTRACT(ISODOW FROM t)返回ISO标准的星期几(周一=1,周日=7),可据此推算本周三(即目标起始日)对应的日期。
本文共计1117个文字,预计阅读时间需要5分钟。
MySQL 的 `WEEK()` 函数默认是根据周内或周日作为起点(取决于 `mode` 参数),但是无法直接指定每周三为起点这类任意偏移的起点。必须手动调整日期来实现:
比如要让每周三为起点(即:周三=第1天,周二=第7天),先用DATE_SUB(dt, INTERVAL 2 DAY)把周三变成周一,再用WEEK(..., 1)按周一为起点计算周编号,就能对齐。
-
WEEK(dt, 1):以周一为周首、周日为周尾,第1周是包含1月4日的那一周 - 若想让周三为起点,偏移量 =
(WEEKDAY('2024-01-03') - 0)→ 周三的WEEKDAY()值是2,目标基准是周一(0),所以OFFSET = 2 - 实际分组SQL写法:
GROUP BY YEARWEEK(DATE_SUB(created_at, INTERVAL 2 DAY), 1) - 注意
YEARWEEK()返回的是类似202405这样的整数,跨年时比单纯WEEK()更安全
PostgreSQL里用EXTRACT(ISODOW)和OFFSET算周边界
PostgreSQL没有内置“任意起始日的周”函数,但EXTRACT(ISODOW FROM t)返回ISO标准的星期几(周一=1,周日=7),可据此推算本周三(即目标起始日)对应的日期。

