sql >> Databasteknik >  >> RDS >> Oracle

Oracle Rekursiv fråga - Datum

Problemet med det du har nu (bortsett från extra cast() och to_date() calls) är att vid den fjärde iterationen är båda villkoren falska så att rekursionen stannar; det finns inget som får det att hoppa över lite och ta upp igen, annars skulle det fortsätta för evigt. Jag tror inte att du kan uppnå båda intervallen inom rekursionen.

Du kan lägga in det senaste datumet du vill ha i den rekursiva delen och sedan filtrera de två intervallen du vill ha efteråt:

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 ersätta de hårdkodade värdena med dina par av start- och slutdatum. Om intervallen kan överlappa eller det andra intervallet kan vara (eller sluta) före det första, kan du välja det högre datumet:

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

... fast det är bara vettigt med variabler, inte fasta värden.




  1. Fel:Datakällan avvisade upprättande av anslutning, meddelande från server:För många anslutningar

  2. UPPDATERA en kolumn baserat på värdet för en annan kolumn i samma tabell

  3. 2 sätt att visa alla databaser i PostgreSQL (psql)

  4. MySQL - skapa vy med hjälp av subquery i FROM-satsen