martes, 24 de julio de 2012

Obtener edad en PostgreSQL


-- select * from fnt_obtener_edad('1986-11-29');

create or replace function fnt_obtener_edad(fecha_nac date)
returns integer as $$
declare
    -- Datos de la fecha de nacimiento
    ano_nac integer;
    mes_nac integer;
    dia_nac integer;
   
    -- Datos de la fecha actual
    ano_act integer;
    mes_act integer;
    dia_act integer;
   
    edad integer;
   
    b boolean;
begin
    ano_act = extract(year from getdate());
    mes_act = extract(month from getdate());
    dia_act = extract(day from getdate());
   
    ano_nac = extract(year from fecha_nac);
    mes_nac = extract(month from fecha_nac);
    dia_nac = extract(day from fecha_nac);
   
    edad = ano_act - ano_nac;
   
    if(mes_act > mes_nac)then
    b = true;
    else
    b = false;
    end if;
   
    if(mes_act = mes_nac)then
if(dia_act >= dia_nac)then
        b = true;
        else
        b = false;
        end if;
    end if;
   
    if(b = true)then
    edad = edad;
    else
    edad = edad - 1;
    end if;
   
    return edad;
end;
$$ language plpgsql;


2 comentarios:

  1. Que pasa si el mes actual es mayor al mes de nacimiento, se supone que la edad debe quedar como edad, sin embargo si el dia actual es menor al dia de nacimiento, la funcion falla ya que le resta uno. Creo que se debe separar el and del dia en el condicional.

    ResponderEliminar