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.