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

Načíst data za 31. prosince posledních 5 let a dnešní datum

Za předpokladu, že vaše data mají vždy časovou složku o půlnoci, pak:

SELECT *
FROM   your_table
WHERE  your_date_column IN (
         TRUNC( SYSDATE ),
         TRUNC( SYSDATE + INTERVAL '1' DAY, 'YYYY' ) - INTERVAL '1' DAY,
         ADD_MONTHS( TRUNC( SYSDATE + INTERVAL '1' DAY, 'YYYY' ) - INTERVAL '1' DAY, -12 ),
         ADD_MONTHS( TRUNC( SYSDATE + INTERVAL '1' DAY, 'YYYY' ) - INTERVAL '1' DAY, -24 ),
         ADD_MONTHS( TRUNC( SYSDATE + INTERVAL '1' DAY, 'YYYY' ) - INTERVAL '1' DAY, -36 ),
         ADD_MONTHS( TRUNC( SYSDATE + INTERVAL '1' DAY, 'YYYY' ) - INTERVAL '1' DAY, -48 )
       );

(Před zkrácením je třeba přidat 1 den, aby odpovídal případu, kdy je dnes 31. prosince)

Jednoduchým řešením by bylo použít TRUNC v den.

SELECT *
FROM   your_table
WHERE  TRUNC( your_date_column ) IN (
         TRUNC( SYSDATE ),
         TRUNC( SYSDATE + INTERVAL '1' DAY, 'YYYY' ) - INTERVAL '1' DAY,
         ADD_MONTHS( TRUNC( SYSDATE + INTERVAL '1' DAY, 'YYYY' ) - INTERVAL '1' DAY, -12 ),
         ADD_MONTHS( TRUNC( SYSDATE + INTERVAL '1' DAY, 'YYYY' ) - INTERVAL '1' DAY, -24 ),
         ADD_MONTHS( TRUNC( SYSDATE + INTERVAL '1' DAY, 'YYYY' ) - INTERVAL '1' DAY, -36 ),
         ADD_MONTHS( TRUNC( SYSDATE + INTERVAL '1' DAY, 'YYYY' ) - INTERVAL '1' DAY, -48 )
       );

Pak ale nemůžete použít index na sloupec a potřebovali byste index založený na funkcích na TRUNC( your_date_column ) abyste mohli používat index.

Složitější řešení, které může používat indexy, je:

SELECT *
FROM   your_table
WHERE  ( your_date_column >= TRUNC( sysdate )
     AND your_date_column  < TRUNC( sysdate ) + INTERVAL '1' DAY
       )
OR     ( your_date_column >= TRUNC( SYSDATE + INTERVAL '1' DAY, 'YYYY' ) - INTERVAL '1' DAY
     AND your_date_column  < TRUNC( SYSDATE + INTERVAL '1' DAY, 'YYYY' )
       )
OR     ( your_date_column >= ADD_MONTHS( TRUNC( SYSDATE + INTERVAL '1' DAY, 'YYYY' ) - INTERVAL '1' DAY, -12 )
     AND your_date_column  < ADD_MONTHS( TRUNC( SYSDATE + INTERVAL '1' DAY, 'YYYY' ), -12 )
       )
OR     ( your_date_column >= ADD_MONTHS( TRUNC( SYSDATE + INTERVAL '1' DAY, 'YYYY' ) - INTERVAL '1' DAY, -12 )
     AND your_date_column  < ADD_MONTHS( TRUNC( SYSDATE + INTERVAL '1' DAY, 'YYYY' ), -24 )
       )
OR     ( your_date_column >= ADD_MONTHS( TRUNC( SYSDATE + INTERVAL '1' DAY, 'YYYY' ) - INTERVAL '1' DAY, -12 )
     AND your_date_column  < ADD_MONTHS( TRUNC( SYSDATE + INTERVAL '1' DAY, 'YYYY' ), -36 )
       )
OR     ( your_date_column >= ADD_MONTHS( TRUNC( SYSDATE + INTERVAL '1' DAY, 'YYYY' ) - INTERVAL '1' DAY, -12 )
     AND your_date_column  < ADD_MONTHS( TRUNC( SYSDATE + INTERVAL '1' DAY, 'YYYY' ), -48 )
       );


  1. Database-Aware Load Balancing:Jak migrovat z HAProxy na ProxySQL

  2. Jak zjistit čas provádění dotazu v Oracle SQL Developer?

  3. Jak vypočítat věci z mnoha tabulek pomocí několika dotazů?

  4. Funkce MySQL TAN() – Vrátí tečnu hodnoty v MySQL