Sqlserver
 sql >> база данни >  >> RDS >> Sqlserver

Как да покажете запис няколко пъти, включително интервали от дни въз основа на началната и крайната му дата

Това е по-лесно в SQL Server, защото можете да използвате рекурсивен CTE. (Всъщност имате такива и в Oracle 12C, така че същият подход работи.)

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;

Това разширява диапазона от дати по месеци за всяко събитие. След това изчислява броя на дните в месеца.

По подразбиране това ще работи до 100 месеца. Можете да използвате maxrecursion опция, ако имате нужда от поддръжка за повече месеци.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. 3 начина за изтриване на дублиращи се редове в SQL Server, като игнорирате първичния ключ

  2. Задайте лимит за редове на таблица в SQL

  3. ROUND() Примери в SQL Server

  4. Най-лесният начин да разграничите две схеми на таблици в SQL Server 2008?

  5. Надстройка на платформата за данни на SQL Server през 2015 г