sql >> Databáze >  >> RDS >> Oracle

Rekurzivní dotaz Oracle – data

Problém s tím, co máte nyní (kromě extra cast() a to_date() volání) je, že při čtvrté iteraci jsou obě podmínky nepravdivé, takže rekurze se zastaví; není nic, co by to trochu přeskočilo a znovu nabralo, jinak by to pokračovalo navždy. Nemyslím si, že můžete dosáhnout obou rozsahů v rámci rekurze.

Do rekurzivní části můžete vložit nejnovější datum, které chcete, a poté filtrovat dva požadované rozsahy:

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 

Pevně ​​zakódované hodnoty můžete nahradit svými dvojicemi počátečního a koncového data. Pokud se rozsahy mohou překrývat nebo druhý rozsah může být (nebo končit) před prvním, můžete vybrat vyšší datum:

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

... i když to dává smysl pouze s proměnnými, nikoli s pevnými hodnotami.




  1. Jak přesunete rozdělenou tabulku z jednoho tabulkového prostoru do druhého v Oracle 11g?

  2. BadImageFormatException. K tomu dojde při spuštění v 64bitovém režimu s nainstalovanými 32bitovými klientskými součástmi Oracle

  3. Tipy pro migraci z HAProxy na ProxySQL

  4. Spokojenost vede k:Riziko se stává realitou