Eu usaria
months_between
, possivelmente combinado com floor
:select floor(months_between(date '2012-10-10', date '2011-10-10') /12) from dual;
select floor(months_between(date '2012-10-9' , date '2011-10-10') /12) from dual;
floor
garante que você obtenha anos arredondados. Se você quer as partes fracionárias, obviamente não quer usar floor
.