Questo è più semplice in SQL Server perché puoi usare un CTE ricorsivo. (In realtà, li hai anche in Oracle 12C, quindi lo stesso approccio funziona.)
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;
Questo espande l'intervallo di date per mese per ogni evento. Quindi calcola il numero di giorni del mese.
Per impostazione predefinita, funzionerà per un massimo di 100 mesi. Puoi usare il maxrecursion
opzione se hai bisogno di supporto per più mesi.