Вам не нужно генерировать все дни, так как это будет неэффективно; просто используйте рекурсивное условие факторинга подзапроса для итерации за каждый месяц:
WITH months ( start_date, next_date, end_date ) AS (
SELECT start_date,
LEAST(
ADD_MONTHS( TRUNC( start_date, 'MM' ), 1 ),
CAST( end_date + INTERVAL '1' DAY AS DATE )
),
CAST( end_date + INTERVAL '1' DAY AS DATE )
FROM table_name
UNION ALL
SELECT next_date,
LEAST( ADD_MONTHS( next_date, 1 ), end_date ),
end_date
FROM months
WHERE next_date < end_date
)
SELECT EXTRACT( YEAR FROM start_date ) AS year,
EXTRACT( MONTH FROM start_date ) AS month,
next_date - start_date AS days
FROM months;
Итак, для ваших тестовых данных:
CREATE TABLE table_name ( start_date, end_date ) AS
SELECT DATE '2020-10-01', DATE '2020-11-02' FROM DUAL
Это выводит:
YEAR | MONTH | DAYS
---: | ----: | ---:
2020 | 10 | 31
2020 | 11 | 2
дБ <> скрипка здесь