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