当月的第一天是单月第一周的开始时间,周的结束时间是星期天,周不能跨月即当月的最后一天就是当月周的最后一天

WITH months AS (
SELECT
ADD_MONTHS(TRUNC(SYSDATE, 'YEAR'), LEVEL - 1) AS month_start,
LAST_DAY(ADD_MONTHS(TRUNC(SYSDATE, 'YEAR'), LEVEL - 1)) AS month_end
FROM dual
CONNECT BY LEVEL <= 12
),
weeks (month_start, month_end, week_start, week_end, week_number) AS (
SELECT
m.month_start,
m.month_end,
m.month_start AS week_start,
LEAST(m.month_start + 7 - TO_CHAR(m.month_start, 'D') + 1, m.month_end) AS week_end,   ---这里参数改成6就是西方的周日开始,改成7就是中国周一开始
1 AS week_number
FROM months m
UNION ALL
SELECT
w.month_start,
w.month_end,
w.week_end + 1 AS week_start,
LEAST(w.week_end + 7, w.month_end) AS week_end,
w.week_number + 1
FROM weeks w
WHERE w.week_end < w.month_end
)
SELECT
TO_CHAR(month_start, 'YYYY-MM') AS "Month",
week_number AS "Week Number",
MIN(week_start) AS "Start Date",
MAX(week_end) AS "End Date"
FROM weeks
GROUP BY month_start, week_number
ORDER BY month_start, week_number;

 

posted @ 2025-03-07 20:41  Iven_lin  阅读(21)  评论(0)    收藏  举报