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

如何在SQL中实现按YYYY-MM-WW月周格式分组日期替代年周统计

解决方案

完全可以实现,不同数据库的语法略有差异,以下是主流数据库的实现方案:

PostgreSQL 实现(兼容你当前使用的to_char语法)

SELECT 
  to_char(date, 'IYYY-MM') || '-' || lpad(
    (ceil(
      (extract(day from date) + (date_trunc('month', date)::date - date_trunc('week', date_trunc('month', date))::date))
      / 7.0
    ))::int::text, 
  2, '0') AS week_of_month
FROM your_table
GROUP BY week_of_month

逻辑说明:先计算当月第一天所属周的偏移天数,加上当前日期的天数后除以7向上取整,即可得到当月周数,最后用lpad补前导零,输出格式和你需求的2021-07-04完全对齐。

MySQL 实现

SELECT 
  CONCAT(
    DATE_FORMAT(date, '%Y-%m'),
    '-',
    LPAD(
      FLOOR((DAYOFMONTH(date) - 1 + WEEKDAY(DATE_SUB(date, INTERVAL DAYOFMONTH(date)-1 DAY))) /7 ) +1,
    2, '0')
  ) AS week_of_month
FROM your_table
GROUP BY week_of_month

默认周起始日为周一,和ISO周规则对齐,如果需要调整周起始日为周日,修改偏移量参数即可。

通用注意事项

  • 如果需要周起始日调整为周日,仅需要将上述逻辑中的偏移量计算减1即可
  • 如果跨月的周需要整周归属到周首所在的月份,将逻辑中所有的date替换为周首日期即可,PostgreSQL对应date_trunc('week', date),MySQL对应DATE_SUB(date, INTERVAL WEEKDAY(date) DAY)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 20:39:02