To je v SQL Server jednodušší, protože můžete použít rekurzivní CTE. (Ve skutečnosti je máte také v Oracle 12C, takže stejný přístup funguje.)
with CTE as (
select event, startdate, enddate,
dateadd(day, 1 - day(startdate), startdate) as month_start
from t
union all
select event, startdate, enddate,
dateadd(month, 1, month_start)
from cte
while month_start <= enddate
)
select event, month_start,
((case when eomonth(enddate) = eomonth(month_start) -- last month
then day(enddate)
else day(eomonth(month_start))
end) -
(case when month_start < startdate -- first month
then day(startdate) - 1
else 0
end)
) as days_in_month
from cte;
Tím se rozšíří časové období o měsíc pro každou událost. Poté vypočítá počet dní v měsíci.
Ve výchozím nastavení to bude fungovat až 100 měsíců. Můžete použít maxrecursion
možnost, pokud potřebujete podporu na více měsíců.