Có nhiều cách để tìm kiếm phạm vi ngày trong Oracle. Đối với tình huống của bạn, tôi khuyên bạn nên chuyển các yếu tố tháng và ngày của tất cả các ngày có liên quan thành số.
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
Điều này sẽ không sử dụng bất kỳ chỉ mục nào trên e.dateOfBirth
cột. Điều đó có quan trọng hay không tùy thuộc vào tần suất bạn muốn chạy truy vấn.
@AdeelAnsari nhận xét:
Chỉ số nào? Chỉ mục bình thường trên dateOfBirth
sẽ không có ích gì, bởi vì các mục nhập chỉ mục sẽ dẫn đầu với phần tử năm. Vì vậy, nó sẽ không giúp bạn tìm thấy tất cả hồ sơ của những người sinh trên bất kỳ 23 tháng 12.
Chỉ mục dựa trên hàm - hoặc trong 11g, một cột ảo có chỉ mục (về cơ bản giống nhau) - là cách duy nhất để lập chỉ mục các phần của cột ngày.