C'è più di un modo per cercare intervalli di date in Oracle. Per il tuo scenario ti suggerisco di trasformare in numeri gli elementi mese e giorno di tutte le date coinvolte.
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
Questo non utilizzerà alcun indice su e.dateOfBirth
colonna. L'importanza di ciò dipende dalla frequenza con cui desideri eseguire la query.
@AdeelAnsari commenta:
Quale indice? Un normale indice su dateOfBirth
non sarà di alcuna utilità, perché le voci dell'indice porteranno con l'elemento year. Quindi non ti aiuterà a trovare tutti i record di persone nate su qualsiasi 23 dicembre.
Un indice basato su funzioni - o in 11g, una colonna virtuale con un indice (praticamente la stessa cosa) - è l'unico modo per indicizzare parti di una colonna di data.