C'est plus facile dans SQL Server car vous pouvez utiliser un CTE récursif. (En fait, vous les avez également dans Oracle 12C, donc la même approche fonctionne.)
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;
Cela élargit la plage de dates par mois pour chaque événement. Il calcule ensuite le nombre de jours dans le mois.
Par défaut, cela fonctionnera jusqu'à 100 mois. Vous pouvez utiliser le maxrecursion
option si vous avez besoin d'assistance pendant plus de mois.