Вы можете извлечь год и сделать интервал (но таким образом можно получить только разницу в году, точную разницу в 20-30 лет нет необходимости)
with datam as
(
select level id, sysdate - level dob
from dual
connect by level < 15000)
select count(id) count_id , extract(year from dob)
from datam
where extract(year from dob) between 2011-30 and 2011-20
group by extract(year from dob)
order by 2 desc
но, игнорируя високосные годы (это то, что вы пытались сделать с 12 * 30, это должно было быть 365 * 12)
with datam as
(
select level id, sysdate - level dob
from dual
connect by level < 15000)
select count(id) count_id , extract(year from dob)
from datam
where dob between (sysdate - 365*30) and (sysdate - 365*20)
group by extract(year from dob)
order by 2 desc ;
Но @ Briguy37 тоже работает:
with datam as
(
select level id, sysdate - level dob
from dual
connect by level < 15000)
select count(id) count_id , extract(year from dob)
from datam
where dob between add_months(dob,- 12*30) and add_months(sysdate,- 12*20)
group by extract(year from dob)
order by 2 desc ;