WITH input_dates ( start_date, end_date ) AS (
SELECT DATE '2018-01-03', DATE '2018-01-31'
FROM DUAL
),
valid_start_date ( start_date, end_date ) AS (
SELECT CASE
WHEN start_date - TRUNC( start_date, 'IW' )
IN (
0, -- Monday
1, -- Tuesday
2, -- Wednesday
3, -- Thursday
6 -- Sunday
)
THEN start_date
ELSE NEXT_DAY( start_date, 'SUNDAY' )
END,
end_date
FROM input_dates
),
dates ( start_week, end_week, end_date ) AS (
SELECT start_date,
LEAST( NEXT_DAY( start_date, 'THURSDAY' ), end_date ),
end_date
FROM valid_start_date
WHERE start_date <= end_date
UNION ALL
SELECT NEXT_DAY( start_week, 'SUNDAY' ),
LEAST( end_week + INTERVAL '7' DAY, end_date ),
end_date
FROM dates
WHERE NEXT_DAY( start_week, 'SUNDAY' ) <= end_date
)
SELECT start_week, end_week
FROM dates
START_WEEK | END_WEEK |
---|---|
03-JAN-18 | 04-JAN-18 |
07-JAN-18 | 11-JAN-18 |
14-JAN-18 | 18-JAN-18 |
21-JAN-18 | 25-JAN-18 |
28-JAN-18 | 31-JAN-18 |
WITH input_dates ( start_date, end_date ) AS (
SELECT DATE '2018-01-03', DATE '2018-01-31'
FROM DUAL
),
valid_start_date ( start_date, end_date ) AS (
SELECT CASE
WHEN start_date - TRUNC( start_date, 'IW' )
IN (
0, -- Monday
1, -- Tuesday
2, -- Wednesday
3, -- Thursday
6 -- Sunday
)
THEN start_date
ELSE NEXT_DAY( start_date, 'SUNDAY' )
END,
end_date
FROM input_dates
)
SELECT CASE
WHEN LEVEL = 1
THEN START_DATE
ELSE NEXT_DAY ( START_DATE - INTERVAL '7' DAY, 'SUNDAY' ) + (LEVEL - 1) * 7
END AS start_week,
LEAST(
NEXT_DAY ( START_DATE - INTERVAL '1' DAY, 'THURSDAY' ) + (LEVEL - 1) * 7,
end_date
) AS end_week
FROM valid_start_date
CONNECT BY
CASE
WHEN LEVEL = 1
THEN START_DATE
ELSE NEXT_DAY ( START_DATE - INTERVAL '7' DAY, 'SUNDAY' ) + (LEVEL - 1) * 7
END <= end_date
START_WEEK | END_WEEK |
---|---|
03-JAN-18 | 04-JAN-18 |
07-JAN-18 | 11-JAN-18 |
14-JAN-18 | 18-JAN-18 |
21-JAN-18 | 25-JAN-18 |
28-JAN-18 | 31-JAN-18 |