J'utiliserais months_between , éventuellement combiné avec 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 s'assure que vous obtenez des années arrondies. Si vous voulez les parties fractionnaires, vous ne voulez évidemment pas utiliser floor .