Oracle
 sql >> Teknologi Basis Data >  >> RDS >> Oracle

Alternatif untuk fungsi decode

Ini dapat dicapai dengan subquery sederhana yang menghitung jumlah tanggal liburan antara tanggal tertentu dan tanggal+5. Berikut ini akan mengembalikan tanggal yaitu lima hari non-liburan di masa mendatang:

testdate+(select 5+count(1) 
            from holiday
           where holidaydate between testdate
                                 and testdate + 5)

Cukup ubah kedua "5" jadi nomor lain untuk mengubah periode evaluasi.

SQLFiddle di sini

Sunting - berdasarkan komentar di bawah, kode saya tidak mengevaluasi hari apa pun setelah hari kelima. Ini mungkin akan jauh lebih mudah dengan sebuah fungsi, tetapi kode berbasis cte berikut juga akan berfungsi:

with cte as ( (select alldate,holidaydate 
                 from (select to_date('20130101','yyyymmdd')+level alldate 
                         from dual 
                       connect by level < 10000 -- adjust for period to evaluate
                      ) alldates 
                      left join holiday on alldate=holidaydate) )
select 
    testdate,test_plus_five
from ( 
    select 
        alldate test_plus_five,testdate,
        sum(case when holidaydate is null 
                 then 1 
                 else 0 end) over (partition by testdate order by alldate) lastday 
    from 
        cte,
        testdates
    where
        alldate >= testdate
    group by
        alldate,holidaydate,testdate)
where
    lastday = 6   

Script ini membangun tabel kalender sehingga dapat mengevaluasi setiap hari (liburan atau non-liburan); lalu kami menghitung hari non-libur, dan menggunakan hari keenam.

SQLFiddle di sini



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Bagaimana cara menggunakan Kursor Ref Oracle dari C# ODP.NET sebagai Parameter ReturnValue, tanpa menggunakan Fungsi atau Prosedur Tersimpan?

  2. Masalah saat mengalihkan proyek .NET dari rakitan ODP.NET yang tidak dikelola ke yang dikelola

  3. Ambil gambar dari Oracle DB

  4. Menggunakan `SELECT` untuk memanggil fungsi

  5. Oracle XMLTYPE mengekstrak nilai prolog root