Oracle
 sql >> Base de Dados >  >> RDS >> Oracle

Consulta Recursiva Oracle - Datas


O problema com o que você tem agora (além de extra cast() e to_date() calls) é que na quarta iteração ambas as condições são falsas, então a recursão pára; não há nada para fazê-lo pular um pouco e pegar novamente, caso contrário, continuaria para sempre. Eu não acho que você possa alcançar os dois intervalos dentro da recursão.

Você pode colocar a data mais recente desejada dentro da parte recursiva e depois filtrar os dois intervalos desejados:
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 

Você pode substituir os valores codificados por seus pares de datas de início e término. Se os intervalos puderem se sobrepor ou o segundo intervalo puder ser (ou terminar) antes do primeiro, você poderá escolher a data mais alta:
    WHERE ADD_MONTHS(TRUNC(cte_date, 'MONTH'), 1)
      <= greatest(date '2015-01-27', date '2014-04-27')

... embora isso só faça sentido com variáveis, não com valores fixos.