Ini lebih mudah di SQL Server karena Anda dapat menggunakan CTE rekursif. (Sebenarnya, Anda memiliki ini di Oracle 12C juga, jadi pendekatan yang sama bekerja.)
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;
Ini memperluas rentang tanggal menurut bulan untuk setiap acara. Kemudian menghitung jumlah hari dalam sebulan.
Secara default, ini akan berfungsi hingga 100 bulan. Anda dapat menggunakan maxrecursion
pilihan jika Anda membutuhkan dukungan untuk beberapa bulan lagi.