sql >> Database >  >> RDS >> Sqlserver

Een record meerdere keren weergeven, inclusief dagintervallen op basis van de start- en einddatums

Dit is gemakkelijker in SQL Server omdat u een recursieve CTE kunt gebruiken. (Eigenlijk heb je deze ook in Oracle 12C, dus dezelfde aanpak werkt.)

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;

Hiermee wordt het datumbereik voor elke gebeurtenis per maand uitgebreid. Het berekent vervolgens het aantal dagen in de maand.

Standaard werkt dit tot 100 maanden. U kunt de maxrecursion . gebruiken optie als u meer maanden ondersteuning nodig heeft.




  1. MySQL SP's en evenementen worden automatisch teruggedraaid door Google Cloud SQL

  2. Hoe maak je een lijst van alle voorbereide verklaringen voor alle actieve sessies?

  3. Mysql:Trim alle velden in de database

  4. ANDROID&PHP - Hoe JSONArray van MySql weer te geven met behulp van PHP