Essayez :
date_part('year',age(coalesce(d1,current_date), d2))::int;
age(d1,d2) renvoie le nombre d'années, de mois et de jours entre deux dates au format suivant :
xxx year(s) xxx mon(s) xxx day(s).
à partir de cette sortie en utilisant date_part() pour choisir la seule différence d'année. et aussi pas besoin de mettre l'instruction if pour gérer NULL comme j'ai ajouté coalesece qui renvoie d'abord NON Null valeur, donc si d1 est NULL il renvoie cuurent_date
Structure de la fonction :
CREATE OR REPLACE FUNCTION diff(d1 date,d2 date) RETURNS int AS $$
BEGIN
RETURN date_part('year',age(coalesce(d1,current_date), d2))::int;
END
$$ language plpgsql;
Appel de fonction :
select * from diff(null,'2010-04-01');
select * from diff('2012-10-01','2010-04-01');