sql >> Databasteknik >  >> RDS >> Oracle

Hämta data för 31 december de senaste 5 åren och dagens datum

Förutsatt att dina datum alltid har en tidskomponent vid midnatt då:

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 )
       );

(Du måste lägga till 1 dag före trunkering för att matcha fallet när idag är den 31 december)

Den enkla lösningen skulle vara att använda TRUNC på datumet.

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 )
       );

Men då kan du inte använda ett index på kolumnen och skulle behöva ett funktionsbaserat index på TRUNC( your_date_column ) för att kunna använda ett index.

Den mer komplicerade lösningen, som kan använda index, är:

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. Hur man får det första elementet av XPath i Oracle

  2. Node.js, PostgreSQL-fel:ingen pg_hba.conf-post för värd

  3. Postgresql i minnesdatabasen django

  4. PostgreSQL-fråga som returnerar värden som inte finns i min databas