Има повече от един начин за търсене в диапазони от дати в Oracle. За вашия сценарий предлагам да превърнете елементите на месеца и деня на всички включени дати в числа.
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
Това няма да използва никакъв индекс на e.dateOfBirth
колона. Дали това има значение зависи от това колко често искате да изпълнявате заявката.
Коментари на @AdeelAnsari:
Какъв индекс? Нормален индекс на dateOfBirth
няма да е от полза, тъй като записите в индекса ще водят с елемента година. Така че няма да ви помогне да намерите всички записи на хора, родени на някой 23 декември.
Индекс, базиран на функция - или в 11g, виртуална колона с индекс (по същество същото нещо) - е единственият начин за индексиране на части от колона с дата.