sql >> Base de Datos >  >> RDS >> Oracle

Consulta recursiva de Oracle - Fechas

El problema con lo que tienes ahora (aparte del extra cast()) y to_date() llamadas) es que en la cuarta iteración, ambas condiciones son falsas, por lo que la recursividad se detiene; no hay nada que haga que salte un poco y se recupere, de lo contrario continuaría para siempre. No creo que puedas lograr ambos rangos dentro de la recursividad.

Puede poner la última fecha que desee dentro de la parte recursiva y luego filtrar los dos rangos que desee después:

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 

Puede reemplazar los valores codificados con sus pares de fechas de inicio y finalización. Si los rangos pueden superponerse o el segundo rango puede ser (o terminar) antes que el primero, puede elegir la fecha más alta:

    WHERE ADD_MONTHS(TRUNC(cte_date, 'MONTH'), 1)
      <= greatest(date '2015-01-27', date '2014-04-27')

... aunque eso solo tiene sentido con variables, no con valores fijos.