sql >> Database >  >> RDS >> Oracle

Oracle recursieve zoekopdracht - datums

Het probleem met wat je nu hebt (afgezien van extra cast() en to_date() oproepen) is dat bij de vierde iteratie beide voorwaarden onwaar zijn, zodat de recursie stopt; er is niets om het een beetje over te laten slaan en weer op te pakken, anders zou het eeuwig doorgaan. Ik denk niet dat je beide bereiken kunt bereiken binnen de recursie.

U kunt de gewenste laatste datum in het recursieve gedeelte plaatsen en daarna de twee gewenste bereiken filteren:

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 

U kunt de hardgecodeerde waarden vervangen door uw paren van start- en einddatums. Als de bereiken elkaar zouden kunnen overlappen of als het tweede bereik voor het eerste zou kunnen liggen (of eindigen), kunt u de hogere datum kiezen:

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

... hoewel dat alleen zinvol is met variabelen, niet met vaste waarden.




  1. Booleaanse expressie gebruiken in volgorde van clausule

  2. Gebruik OBJECTPROPERTY() om erachter te komen of een object een CHECK-beperking is in SQL Server

  3. MySQL-fout:mysql_fetch_assoc() verwacht dat parameter 1 resource is

  4. T-sql - bepaal of de waarde een geheel getal is