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

Oracle rekursiv forespørgsel - datoer

Problemet med det du har nu (bortset fra ekstra cast() og to_date() kalder) er, at på den fjerde iteration er begge betingelserne falske, så rekursionen stopper; der er ikke noget, der får det til at springe lidt over og tage det op igen, ellers ville det fortsætte for evigt. Jeg tror ikke, du kan opnå begge områder inden for rekursionen.

Du kan sætte den seneste dato, du ønsker, inde i den rekursive del, og derefter filtrere de to intervaller, du ønsker bagefter:

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 

Du kan erstatte de hårdkodede værdier med dine par af start- og slutdatoer. Hvis områderne måske overlapper hinanden, eller det andet område kan være (eller slutte) før det første, kan du vælge den højeste dato:

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

... selvom det kun giver mening med variabler, ikke faste værdier.




  1. hvordan man forhindrer dubletter med indre joinforespørgsel (Postgres)

  2. HikariCP:Hvilke timeouts på databaseniveau skal overvejes for at indstille maxLifetime for Oracle 11g

  3. Sådan henter du uploadede filer ved hjælp af php

  4. rail server fejl? (skinner 3) i vinduer