Вы должны сделать вашу фильтрацию на основе DOB не вычисляемое поле -
SELECT name, DOB
FROM animal
WHERE colour = 'Brown'
AND DOB > (CURRENT_DATE - INTERVAL 3 YEAR);
EDIT В свете принятого ответа я чувствую необходимость объяснить свой ответ. Использование -
where colour = 'Brown' and truncate(datediff(sysdate(),DOB)/365.25,0) <=2;
как метод фильтрации возраст не является эффективным, поскольку это требует возраст исчисляется в порядке, чтобы сделать сравнение, делая любой индекс по столбцу DOB бесполезно. Принимая во внимание, фильтрация на поле DOB непосредственно затем можно использовать любой применимый индекс -
DOB > (CURRENT_DATE - INTERVAL 3 YEAR);
Это просто говорит «дата рождения больше, чем сегодня минус три года». Таким образом, дата рождения «2009-03-22» и текущей даты «2012-03-22», будет оцениваться как -
'2009-03-22' > ('2012-03-22' - INTERVAL 3 YEAR)
, который, в свою очередь, становится -
'2009-03-22' > '2009-03-22'
, который оценивает к фальшивому, поскольку человеку сейчас 3 (сегодня). В то время как, если день рождения человека завтра ('2009-03-23') они все еще 2 -
'2009-03-23' > ('2012-03-22' - INTERVAL 3 YEAR)
, который в свою очередь становится -
'2009-03-23' > '2009-03-22'
, который оценивает к истине.
Если вы могли бы установить пример на sqlfiddle.com, было бы гораздо проще. –