Sqlserver
 sql >> Datenbank >  >> RDS >> Sqlserver

So zeigen Sie einen Datensatz mehrmals einschließlich Tagesintervallen basierend auf seinem Start- und Enddatum an

Dies ist in SQL Server einfacher, da Sie einen rekursiven CTE verwenden können. (Eigentlich haben Sie diese auch in Oracle 12C, also funktioniert der gleiche Ansatz.)

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;

Dadurch wird der Datumsbereich für jedes Ereignis um einen Monat erweitert. Es berechnet dann die Anzahl der Tage im Monat.

Standardmäßig funktioniert dies für bis zu 100 Monate. Sie können die maxrecursion verwenden Option, wenn Sie Unterstützung für weitere Monate benötigen.