Tentar :
date_part('year',age(coalesce(d1,current_date), d2))::int;
age(d1,d2)
A função retorna o número de anos, meses e dias entre duas datas no seguinte formato:xxx year(s) xxx mon(s) xxx day(s).
desta saída usando
date_part()
para escolher a única diferença do ano. e também não há necessidade de colocar a instrução if para lidar com NULL
como eu adicionei coalesece
que retorna primeiro NON Null
valor, então se d1
é NULL
ele retorna cuurent_date
Estrutura da Função:
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;
Chamada de função:
select * from diff(null,'2010-04-01');
select * from diff('2012-10-01','2010-04-01');