Sqlserver
 sql >> Database >  >> RDS >> Sqlserver

Come visualizzare un record più volte, inclusi gli intervalli di giorni in base alle date di inizio e fine

Questo è più semplice in SQL Server perché puoi usare un CTE ricorsivo. (In realtà, li hai anche in Oracle 12C, quindi lo stesso approccio funziona.)

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;

Questo espande l'intervallo di date per mese per ogni evento. Quindi calcola il numero di giorni del mese.

Per impostazione predefinita, funzionerà per un massimo di 100 mesi. Puoi usare il maxrecursion opzione se hai bisogno di supporto per più mesi.