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

SQL如何基于每月1号计算周数及对应周的开始与结束日期

SQL实现方案

核心计算规则

以每月1号为当月周数的计算基准,周数从1开始计数,周的起始/结束可根据业务规则调整(下方示例默认以周一为周起始、周日为周结束,可自行修改偏移量适配其他规则)。

常用数据库实现代码

MySQL 版本

假设源表名为source_table,存储日期的字段名为dt:

SELECT 
    dt,
    -- 计算当月周数字段
    FLOOR(DATEDIFF(dt, DATE_SUB(DATE_FORMAT(dt, '%Y-%m-01'), INTERVAL WEEKDAY(DATE_FORMAT(dt, '%Y-%m-01')) DAY)) / 7) + 1 AS month_week_num,
    -- 计算当前周开始日期(周一)
    DATE_SUB(dt, INTERVAL WEEKDAY(dt) DAY) AS week_start_date,
    -- 计算当前周结束日期(周日)
    DATE_ADD(dt, INTERVAL (6 - WEEKDAY(dt)) DAY) AS week_end_date
FROM source_table;

如果需要以周日为周起始,调整偏移量即可:

SELECT 
    dt,
    FLOOR(DATEDIFF(dt, DATE_SUB(DATE_FORMAT(dt, '%Y-%m-01'), INTERVAL (DAYOFWEEK(DATE_FORMAT(dt, '%Y-%m-01')) - 1) DAY)) / 7) + 1 AS month_week_num,
    DATE_SUB(dt, INTERVAL (DAYOFWEEK(dt) - 1) DAY) AS week_start_date,
    DATE_ADD(dt, INTERVAL (7 - DAYOFWEEK(dt)) DAY) AS week_end_date
FROM source_table;

Hive/Spark SQL 版本

SELECT 
    dt,
    FLOOR(DATEDIFF(dt, DATE_SUB(DATE_TRUNC('month', dt), WEEKDAY(DATE_TRUNC('month', dt)))) / 7) + 1 AS month_week_num,
    DATE_SUB(dt, WEEKDAY(dt)) AS week_start_date,
    DATE_ADD(dt, 6 - WEEKDAY(dt)) AS week_end_date
FROM source_table;

适配提示

如果源表日期字段为字符串格式,需要先转换为日期类型再参与计算:

  • MySQL 用 STR_TO_DATE(日期字符串, '%Y-%m-%d')
  • Hive/Spark SQL 用 TO_DATE(日期字符串)

内容的提问来源于stack exchange,提问作者Ankur Singh Bhandari

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 04:45:04