Oracle
 sql >> Teknologi Basis Data >  >> RDS >> Oracle

Ambil data untuk 31 Des 5 tahun terakhir dan tanggal hari ini

Dengan asumsi tanggal Anda selalu memiliki komponen waktu di tengah malam, maka:

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

(Anda perlu menambahkan 1 hari sebelum memotong agar sesuai dengan kasus ketika hari ini adalah 31 Desember)

Solusi sederhananya adalah dengan menggunakan TRUNC pada tanggal.

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

Tetapi kemudian Anda tidak dapat menggunakan indeks pada kolom dan akan membutuhkan indeks berbasis fungsi pada TRUNC( your_date_column ) untuk dapat menggunakan indeks.

Solusi yang lebih rumit, yang dapat menggunakan indeks, adalah:

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
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. ORACLE NLS_LANG

  2. Cara mengindeks kolom Y/N di Oracle

  3. Fungsi jendela SORT mahal, bisakah kita mengatasinya?

  4. Bagaimana cara Menjalankan prosedur tersimpan dari SQL Plus?

  5. ORA-02287:nomor urut tidak diperbolehkan di sini