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

Tanggal Oracle Antara Kueri

Dilihat dari output Anda, sepertinya Anda telah menetapkan START_DATE sebagai stempel waktu. Jika itu adalah tanggal reguler, Oracle akan dapat menangani konversi implisit. Tetapi karena tidak, Anda perlu secara eksplisit memasukkan string tersebut menjadi tanggal.

SQL> alter session set nls_date_format = 'dd-mon-yyyy hh24:mi:ss'
  2  /

Session altered.

SQL>
SQL> select * from t23
  2  where start_date between '15-JAN-10' and '17-JAN-10'
  3  /

no rows selected

SQL> select * from t23
  2  where start_date between to_date('15-JAN-10') and to_date('17-JAN-10')
  3  /

WIDGET                          START_DATE
------------------------------  ----------------------
Small Widget                    15-JAN-10 04.25.32.000    

SQL> 

Tapi kami masih hanya mendapatkan satu baris. Ini karena START_DATE memiliki elemen waktu. Jika kami tidak menentukan komponen waktu, Oracle akan menetapkan default ke tengah malam. Itu bagus untuk dari sisi BETWEEN tapi tidak untuk sampai samping:

SQL> select * from t23
  2  where start_date between to_date('15-JAN-10') 
  3                       and to_date('17-JAN-10 23:59:59')
  4  /

WIDGET                          START_DATE
------------------------------  ----------------------
Small Widget                    15-JAN-10 04.25.32.000
Product 1                       17-JAN-10 04.31.32.000

SQL>

edit

Jika Anda tidak dapat melewatkan komponen waktu, ada beberapa pilihan. Salah satunya adalah mengubah klausa WHERE untuk menghapus elemen waktu dari kriteria:

where trunc(start_date) between to_date('15-JAN-10') 
                            and to_date('17-JAN-10')

Ini mungkin berdampak pada kinerja, karena mendiskualifikasi indeks b-tree pada START_DATE. Anda perlu membangun indeks berbasis fungsi sebagai gantinya.

Atau Anda dapat menambahkan elemen waktu ke tanggal dalam kode Anda:

where start_date between to_date('15-JAN-10') 
                     and to_date('17-JAN-10') + (86399/86400) 

Karena masalah ini banyak orang memilih untuk menghindari penggunaan between dengan memeriksa batas tanggal seperti ini:

where start_date >= to_date('15-JAN-10') 
and start_date < to_date('18-JAN-10')


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Bagaimana cara memilih 1 teratas dan diurutkan berdasarkan tanggal di Oracle SQL?

  2. Bagaimana saya bisa memperkenalkan beberapa kondisi di operator LIKE?

  3. urutan oracle hibernasi menghasilkan celah besar

  4. (+) =operator di Oracle sql di mana klausa

  5. REGEXP_COUNT() Fungsi di Oracle