Problemet med det du har nu (bortset fra ekstra cast()
og to_date()
kalder) er, at på den fjerde iteration er begge betingelserne falske, så rekursionen stopper; der er ikke noget, der får det til at springe lidt over og tage det op igen, ellers ville det fortsætte for evigt. Jeg tror ikke, du kan opnå begge områder inden for rekursionen.
Du kan sætte den seneste dato, du ønsker, inde i den rekursive del, og derefter filtrere de to intervaller, du ønsker bagefter:
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
Du kan erstatte de hårdkodede værdier med dine par af start- og slutdatoer. Hvis områderne måske overlapper hinanden, eller det andet område kan være (eller slutte) før det første, kan du vælge den højeste dato:
WHERE ADD_MONTHS(TRUNC(cte_date, 'MONTH'), 1)
<= greatest(date '2015-01-27', date '2014-04-27')
... selvom det kun giver mening med variabler, ikke faste værdier.