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

Sådan viser du en registrering flere gange inklusive dagsintervaller baseret på dens start- og slutdatoer

Dette er nemmere i SQL Server, fordi du kan bruge en rekursiv CTE. (Faktisk har du også disse i Oracle 12C, så den samme tilgang virker.)

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;

Dette udvider datointervallet for måned for hver begivenhed. Den beregner derefter antallet af dage i måneden.

Som standard vil dette virke i op til 100 måneder. Du kan bruge maxrecursion mulighed, hvis du har brug for support i flere måneder.




  1. Hvordan opretter man tabel i SYS-skema i SQL Server?

  2. vælg alle kolonner med gruppe efter i dvalekriterieforespørgsler

  3. PowerShell - Liste over alle SQL-instanser på mit system?

  4. Oprettelse af midlertidige tabeller i SQL