W Oracle istnieje więcej niż jeden sposób wyszukiwania zakresów dat. W swoim scenariuszu sugeruję, abyś zamienił elementy miesiąca i dnia wszystkich dat na liczby.
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
Nie użyje to żadnego indeksu w e.dateOfBirth
kolumna. To, czy ma to znaczenie, zależy od tego, jak często chcesz uruchamiać zapytanie.
@AdeelAnsari komentarze:
Jaki indeks? Normalny indeks w dniu dateOfBirth
na nic się nie przyda, ponieważ pozycje indeksu będą prowadzić z elementem year. Nie pomoże Ci więc znaleźć wszystkich danych osób urodzonych w dowolnym 23 grudnia.
Indeks oparty na funkcjach - lub w 11g, wirtualna kolumna z indeksem (w zasadzie to samo) - jest jedynym sposobem indeksowania części kolumny daty.