Sqlserver
 sql >> Base de Dados >  >> RDS >> Sqlserver

Como exibir um registro várias vezes, incluindo intervalos de dias com base em suas datas de início e término


Isso é mais fácil no SQL Server porque você pode usar uma CTE recursiva. (Na verdade, você também tem isso no Oracle 12C, então a mesma abordagem funciona.)
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;

Isso expande o intervalo de datas por mês para cada evento. Em seguida, calcula o número de dias no mês.

Por padrão, isso funcionará por até 100 meses. Você pode usar o maxrecursion opção se precisar de suporte por mais meses.