Het probleem met wat je nu hebt (afgezien van extra cast()
en to_date()
oproepen) is dat bij de vierde iteratie beide voorwaarden onwaar zijn, zodat de recursie stopt; er is niets om het een beetje over te laten slaan en weer op te pakken, anders zou het eeuwig doorgaan. Ik denk niet dat je beide bereiken kunt bereiken binnen de recursie.
U kunt de gewenste laatste datum in het recursieve gedeelte plaatsen en daarna de twee gewenste bereiken filteren:
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
U kunt de hardgecodeerde waarden vervangen door uw paren van start- en einddatums. Als de bereiken elkaar zouden kunnen overlappen of als het tweede bereik voor het eerste zou kunnen liggen (of eindigen), kunt u de hogere datum kiezen:
WHERE ADD_MONTHS(TRUNC(cte_date, 'MONTH'), 1)
<= greatest(date '2015-01-27', date '2014-04-27')
... hoewel dat alleen zinvol is met variabelen, niet met vaste waarden.