Use a row-generator to generate a list of weeks for the month:
WITH input (month) AS (
SELECT DATE '2023-02-01' FROM DUAL
),
calendar (week_start) AS (
SELECT TRUNC(TRUNC(month, 'MM'), 'IW') + 7 * (LEVEL - 1)
FROM input
CONNECT BY TRUNC(TRUNC(month, 'MM'), 'IW') + 7 * (LEVEL - 1)
< ADD_MONTHS(TRUNC(month, 'MM'), 1)
)
SELECT week_start,
week_start + INTERVAL '6 23:59:59' DAY TO SECOND AS week_end
FROM calendar
Which outputs:
WEEK_START |
WEEK_END |
2023-01-30 00:00:00 |
2023-02-05 23:59:59 |
2023-02-06 00:00:00 |
2023-02-12 23:59:59 |
2023-02-13 00:00:00 |
2023-02-19 23:59:59 |
2023-02-20 00:00:00 |
2023-02-26 23:59:59 |
2023-02-27 00:00:00 |
2023-03-05 23:59:59 |
fiddle