Er is meer dan één manier om datumbereiken te zoeken in Oracle. Voor je scenario raad ik je aan om de maand- en dagelementen van alle betrokken datums om te zetten in getallen.
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
Dit gebruikt geen index op de e.dateOfBirth
kolom. Of dat uitmaakt, hangt af van hoe vaak u de query wilt uitvoeren.
@AdeelAnsari opmerkingen:
Welke index? Een normale index op dateOfBirth
zal van geen enkel nut zijn, omdat de indexvermeldingen zullen leiden met het jaarelement. Het zal je dus niet helpen om alle gegevens te vinden van mensen die geboren zijn op elke 23 dec.
Een functiegebaseerde index - of in 11g, een virtuele kolom met een index (in principe hetzelfde) - is de enige manier om delen van een datumkolom te indexeren.