Det finns mer än ett sätt att söka efter datumintervall i Oracle. För ditt scenario föreslår jag att du omvandlar månads- och dagelementen för alla inblandade datum till siffror.
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
Detta kommer inte att använda något index på e.dateOfBirth
kolumn. Om det spelar någon roll beror på hur ofta du vill köra frågan.
@AdeelAnsari kommenterar:
Vilket index? Ett normalt index på dateOfBirth
kommer inte att vara till någon nytta, eftersom indexposterna kommer att leda med årselementet. Så det hjälper dig inte att hitta alla register över personer födda på någon 23:e december.
Ett funktionsbaserat index - eller i 11g, en virtuell kolumn med ett index (i princip samma sak) - är det enda sättet att indexera delar av en datumkolumn.