Das Problem mit dem, was Sie jetzt haben (abgesehen von zusätzlichen cast()
und to_date()
Aufrufe) ist, dass bei der vierten Iteration beide Bedingungen falsch sind, sodass die Rekursion stoppt; es gibt nichts, was es ein bisschen überspringen und wieder aufnehmen lässt, sonst würde es ewig weitergehen. Ich glaube nicht, dass Sie beide Bereiche innerhalb der Rekursion erreichen können.
Sie können das gewünschte späteste Datum in den rekursiven Teil einfügen und anschließend die beiden gewünschten Bereiche filtern:
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
Sie können die hartcodierten Werte durch Ihre Start- und Enddatumspaare ersetzen. Wenn sich die Bereiche überschneiden oder der zweite Bereich vor dem ersten liegen (oder enden) könnte, könnten Sie das höhere Datum auswählen:
WHERE ADD_MONTHS(TRUNC(cte_date, 'MONTH'), 1)
<= greatest(date '2015-01-27', date '2014-04-27')
... das macht aber nur Sinn mit Variablen, nicht mit festen Werten.