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

Kueri Rekursif Oracle - Tanggal

Masalah dengan apa yang Anda miliki sekarang (selain cast() tambahan) dan to_date() panggilan) adalah bahwa pada iterasi keempat kedua kondisinya salah sehingga rekursi berhenti; tidak ada yang membuatnya melompat sedikit dan mengambil lagi, jika tidak maka akan berlanjut selamanya. Saya tidak berpikir Anda dapat mencapai kedua rentang dalam rekursi.

Anda dapat memasukkan tanggal terbaru yang Anda inginkan di dalam bagian rekursif, lalu memfilter dua rentang yang Anda inginkan setelahnya:

WITH CTE_Dates (cte_date)  AS (
    SELECT date '2014-01-27'  from dual
    UNION ALL
    SELECT ADD_MONTHS(TRUNC(cte_date, 'MONTH'), 1)
    FROM CTE_Dates
    WHERE ADD_MONTHS(TRUNC(cte_date, 'MONTH'), 1) <= date '2015-01-27'
)
SELECT * from CTE_Dates
WHERE cte_date BETWEEN date '2014-01-27' AND date '2014-04-27'
OR cte_date BETWEEN date '2014-11-27' AND date '2015-01-27';

CTE_DATE 
---------
27-JAN-14 
01-FEB-14 
01-MAR-14 
01-APR-14 
01-DEC-14 
01-JAN-15 

 6 rows selected 

Anda dapat mengganti nilai hard-code dengan pasangan tanggal mulai dan berakhir. Jika rentang mungkin tumpang tindih atau rentang kedua dapat (atau berakhir) sebelum rentang pertama, Anda dapat memilih tanggal yang lebih tinggi:

    WHERE ADD_MONTHS(TRUNC(cte_date, 'MONTH'), 1)
      <= greatest(date '2015-01-27', date '2014-04-27')

... meskipun itu hanya masuk akal dengan variabel, bukan nilai tetap.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Di mana Oracle ADF 11g berdiri di antara Java EE Frameworks?

  2. Membatasi catatan yang dikembalikan dari kueri SQL di Oracle

  3. Oracle -- Impor data ke tabel dengan nama berbeda?

  4. Oracle RESET_PACKAGE tidak mengatur ulang nilai variabel dalam sesi

  5. Bagaimana Oracle XMLTYPE di Hibernate