Sqlserver
 sql >> Base de données >  >> RDS >> Sqlserver

Comment afficher un enregistrement plusieurs fois, y compris des intervalles de jours en fonction de ses dates de début et de fin

C'est plus facile dans SQL Server car vous pouvez utiliser un CTE récursif. (En fait, vous les avez également dans Oracle 12C, donc la même approche fonctionne.)

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;

Cela élargit la plage de dates par mois pour chaque événement. Il calcule ensuite le nombre de jours dans le mois.

Par défaut, cela fonctionnera jusqu'à 100 mois. Vous pouvez utiliser le maxrecursion option si vous avez besoin d'assistance pendant plus de mois.