Sqlserver
 sql >> Baza danych >  >> RDS >> Sqlserver

Jak wyświetlić rekord wiele razy, w tym interwały dzienne w oparciu o daty rozpoczęcia i zakończenia?

Jest to łatwiejsze w SQL Server, ponieważ można użyć rekurencyjnego CTE. (W rzeczywistości masz je również w Oracle 12C, więc to samo podejście działa.)

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;

Rozszerza to zakres dat o miesiąc dla każdego wydarzenia. Następnie oblicza liczbę dni w miesiącu.

Domyślnie będzie to działać do 100 miesięcy. Możesz użyć maxrecursion opcja, jeśli potrzebujesz wsparcia przez więcej miesięcy.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Jak usunąć wiersze w tabelach zawierające klucze obce do innych tabel

  2. Dodaj wiele rekordów za pomocą Linq-to-SQL

  3. Uzyskaj wartości graniczne dla tabeli partycjonowanej w programie SQL Server (T-SQL)

  4. Jak programowo zmienić wartości kolumn tożsamości?

  5. Instalacja SQL Server 2017 krok po kroku -2