sql >> Databasteknik >  >> RDS >> Sqlserver

Hur man visar en post flera gånger inklusive dagsintervall baserat på dess start- och slutdatum

Detta är enklare i SQL Server eftersom du kan använda en rekursiv CTE. (Du har faktiskt dessa i Oracle 12C också, så samma tillvägagångssätt fungerar.)

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;

Detta utökar datumintervallet för månad för varje händelse. Den beräknar sedan antalet dagar i månaden.

Som standard kommer detta att fungera i upp till 100 månader. Du kan använda maxrecursion alternativ om du behöver support i fler månader.




  1. Hur skriver man preparera och exekvera uttalanden i OOP PDO?

  2. Hur får jag JSON-data från php och skärm till textview i Android?

  3. Dynamiska säkerhetsfrågor på webbplatsen (PHP+MySQL)

  4. SQL-syntax eller databasbegränsningar?