Dies ist in SQL Server einfacher, da Sie einen rekursiven CTE verwenden können. (Eigentlich haben Sie diese auch in Oracle 12C, also funktioniert der gleiche Ansatz.)
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;
Dadurch wird der Datumsbereich für jedes Ereignis um einen Monat erweitert. Es berechnet dann die Anzahl der Tage im Monat.
Standardmäßig funktioniert dies für bis zu 100 Monate. Sie können die maxrecursion
verwenden Option, wenn Sie Unterstützung für weitere Monate benötigen.