Oracle
 sql >> Database >  >> RDS >> Oracle

Query ricorsiva Oracle - Date

Il problema con quello che hai ora (a parte cast() extra e to_date() call) è che alla quarta iterazione entrambe le condizioni sono false quindi la ricorsione si interrompe; non c'è niente che lo faccia saltare un po' e riprenderlo, altrimenti continuerebbe per sempre. Non credo che tu possa ottenere entrambi gli intervalli all'interno della ricorsione.

Puoi inserire l'ultima data che desideri all'interno della parte ricorsiva, quindi filtrare i due intervalli che desideri in seguito:

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 

Puoi sostituire i valori hardcoded con le tue coppie di date di inizio e fine. Se gli intervalli potrebbero sovrapporsi o il secondo intervallo potrebbe essere (o terminare) prima del primo, puoi scegliere la data più alta:

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

... anche se ha senso solo con variabili, non valori fissi.