Der er mere end én måde at søge efter datointervaller i Oracle. Til dit scenarie foreslår jeg, at du omsætter måneds- og dagelementerne for alle de involverede datoer til tal.
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
Dette vil ikke bruge noget indeks på e.dateOfBirth
kolonne. Hvorvidt det betyder noget, afhænger af, hvor ofte du vil køre forespørgslen.
@AdeelAnsari kommenterer:
Hvilket indeks? Et normalt indeks på dateOfBirth
kommer ikke til at være til nogen nytte, fordi indeksposterne vil føre med årstal. Så det hjælper dig ikke med at finde alle optegnelser over personer, der er født på enhver 23. december.
Et funktionsbaseret indeks - eller i 11g, en virtuel kolonne med et indeks (dybest set det samme) - er den eneste måde at indeksere dele af en datokolonne på.