Calculando edad en Delphi

By: Emilio Garci­a Granda

Abstract: En este artículo muestro una variante de un método para calcular la edad de la persona la cual es muy utilizada en aplicaciones en base de datos.

En este artículo muestro una variante de un método para calcular la edad de la persona la cual es muy utilizada en aplicaciones en base de datos. Esta variante evita que se hagan comprobaciones de mes y día para deducir la edad, valiéndose de la aritmética y tratando a las fechas como simples puntos flotantes.

El código:

unit Datemap;

interface

uses
  SysUtils,DateUtils;

function YearOld(ADate,CurrentDate : TDateTime) : Integer; stdcall; overload;
function YearOld(ADate : TDateTime) : Integer; stdcall; overload;


implementation


function YearOld(ADate,CurrentDate : TDateTime) : Integer;
var
  aYear,aMonth,aDay : Word;
  TempDate : TDateTime;
begin

  aYear := YearOf(CurrentDate);
  aMonth := MonthOf(ADate);
  aDay := DayOf(ADate);

//se trata de convertir a una fecha válida 
 if TryEncodeDate(aYear,aMonth,aDay,TempDate) then
  begin

//si la fecha actual es <= a la fecha conformada entonces ya cumplió años 
    if CurrentDate <= TempDate then
    Result := YearOf(CurrentDate) - YearOf(ADate)
    else Result := YearOf(CurrentDate) - YearOf(ADate) -1;
  end
  else Result := 0; // 0 sino puede convertir una fecha válida

end;

function YearOld(ADate : TDateTime) : Integer;
begin
  Result := YearOld(ADate,Date);
end;

end.

Por razones de reutilización decidí poner el código dentro de una dll, y lo amplié sobrecargando la función para poder calcular la edad entre una fecha y la fecha actual y entre dos fechas cualesquiera. La idea es crear una fecha nueva tomando el mes y el día de la fecha de nacimiento y el año de la fecha actual

Ejemplo:

fecha de nacimiento: 30/03/1990

Fecha actual:19/04/2007

Fecha conformada:30/03/2007

Esta función también corrige los problemas que puede provocar el año bisiesto, devolviendo 0 sino se puede convertir el 29/02/#### a una fecha válida.


Server Response from: ETNASC04