Oracle
 sql >> Datenbank >  >> RDS >> Oracle

Rekursive Oracle-Abfrage - Daten

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.