如何通过OFFSET调整SQL中按周统计数据的起始周?

2026-04-27 17:390阅读0评论SEO资源
  • 内容介绍
  • 相关推荐

本文共计1117个文字,预计阅读时间需要5分钟。

如何通过OFFSET调整SQL中按周统计数据的起始周?

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分钟。

如何通过OFFSET调整SQL中按周统计数据的起始周?

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),可据此推算本周三(即目标起始日)对应的日期。

阅读全文