martes, 8 de julio de 2014

Get age using the identity card number


-- select * from fnt_obtener_edad('003-251082-0015W');

-- DROP FUNCTION fnt_obtener_edad(date);

CREATE OR REPLACE FUNCTION fnt_obtener_edad(num_cedula varchar)
  RETURNS integer AS
$BODY$ 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;

     fecha_nac date;
begin
    if(length(num_cedula) = 16)then
        fecha_nac = (substring(num_cedula, 9, 2) || substring(num_cedula, 7, 2) || substring(num_cedula, 5, 2))::date;

        if(extract(year from fecha_nac) >= extract(year from current_date))then
            fecha_nac = ((extract(year from fecha_nac) - 100)::varchar || to_char(fecha_nac, 'MMdd'))::date;
        end if;
    else
        fecha_nac = null;
    end if;

     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;
$BODY$
  LANGUAGE plpgsql VOLATILE
  COST 100;

No hay comentarios:

Publicar un comentario