Sqlserver
 sql >> Teknologi Basis Data >  >> RDS >> Sqlserver

Cara menampilkan catatan beberapa kali termasuk interval hari berdasarkan tanggal mulai dan berakhir

Ini lebih mudah di SQL Server karena Anda dapat menggunakan CTE rekursif. (Sebenarnya, Anda memiliki ini di Oracle 12C juga, jadi pendekatan yang sama bekerja.)

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;

Ini memperluas rentang tanggal menurut bulan untuk setiap acara. Kemudian menghitung jumlah hari dalam sebulan.

Secara default, ini akan berfungsi hingga 100 bulan. Anda dapat menggunakan maxrecursion pilihan jika Anda membutuhkan dukungan untuk beberapa bulan lagi.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. tumpukan SQL Server vs. indeks berkerumun

  2. Menyimpan pesan galat SqlServer di C#

  3. SQL Server setara dengan MySQL's EXPLAIN

  4. Metode Ekspor dan Impor Tabel Database SQL Server

  5. Masukkan seluruh DataTable ke dalam database sekaligus, bukan baris demi baris?