これは、再帰的な CTE を使用できるため、SQL Server では簡単です。 (実際、これらは 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
を使用できます さらに数か月のサポートが必要な場合は、オプションを選択してください。