Ada lebih dari satu cara untuk mencari rentang tanggal di Oracle. Untuk skenario Anda, saya sarankan Anda mengubah elemen bulan dan hari dari semua tanggal yang terlibat menjadi angka.
select
p.id as person_id,
...
...
where e.active = 1
and to_number (to_char( e.dateOfBirth, 'MMDD'))
between to_number (to_char( FROMDATE, 'MMDD'))
and to_number (to_char( TODATE, 'MMDD'))
order by extract(month from e.dateOfBirth) DESC,
extract(day from e.dateOfBirth) DESC
Ini tidak akan menggunakan indeks apa pun pada e.dateOfBirth
kolom. Apakah itu penting tergantung pada seberapa sering Anda ingin menjalankan kueri.
@AdeelAnsari komentar:
indeks apa? Indeks normal pada dateOfBirth
tidak akan ada gunanya, karena entri indeks akan mengarah dengan elemen tahun. Jadi itu tidak akan membantu Anda menemukan semua catatan orang yang lahir di apa pun 23 Desember.
Indeks berbasis fungsi - atau dalam 11g, kolom virtual dengan indeks (pada dasarnya sama) - adalah satu-satunya cara mengindeks bagian kolom tanggal.