SQL सर्वर में यह आसान है क्योंकि आप एक पुनरावर्ती CTE का उपयोग कर सकते हैं। (वास्तव में, आपके पास ये Oracle 12C में भी हैं, इसलिए वही तरीका काम करता है।)
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;
यह हर इवेंट के लिए तारीख की सीमा को महीने दर महीने बढ़ाता है. इसके बाद यह महीने में दिनों की संख्या की गणना करता है।
डिफ़ॉल्ट रूप से, यह 100 महीने तक काम करेगा। आप maxrecursion
. का उपयोग कर सकते हैं विकल्प अगर आपको और महीनों के लिए समर्थन की आवश्यकता है।