Вам нужна максимальная производительность, и поэтому вы готовы внести изменения в схему? Или количество записей настолько мало, а производительность относительно не важна, поэтому вам нужен запрос, который будет работать с данными как есть?
Самый простой и быстрый способ сделать это - сохранить второе поле данных о рождении, но «без» года. Я помещаю цитаты вокруг «без», потому что у даты не может быть года. Так что вместо этого вы просто основываетесь на другом году.
Повторное датирование каждого DoB к 2000 году - мой хороший выбор. Потому что он включает високосный год и является хорошим круглым числом. Каждый DoB и FromDate и ToDate будут работать в 2000 году ...
WHERE
DoB2000 >= FromDate
AND DoB2000 <= ToDate
(Предполагается, что вы также индексируете новое поле для ускорения поиска, в противном случае вы все равно получаете сканирование, хотя оно МОЖЕТ быть быстрее, чем следующая альтернатива.)
1012 *
*
В качестве альтернативы, вы можете продолжать использовать шаблон EXTRACT. Но это будет иметь неприятные последствия; это очень грязно, и вы никогда не получите индекс поиска, вы всегда получите индекс сканирования. Это связано с тем, что искомое поле обернуто в вызов функции.
WHERE
( EXTRACT(month FROM e.DateOfBirth) > EXTRACT(month FROM FromDate)
OR ( EXTRACT(month FROM e.DateOfBirth) = EXTRACT(month FROM FromDate)
AND EXTRACT(day FROM e.DateOfBirth) >= EXTRACT(day FROM FromDate)
)
)
AND
( EXTRACT(month FROM e.DateOfBirth) < EXTRACT(month FROM ToDate)
OR ( EXTRACT(month FROM e.DateOfBirth) = EXTRACT(month FROM ToDate)
AND EXTRACT(day FROM e.DateOfBirth) <= EXTRACT(day FROM ToDate)
)
)