Para los programdores-calcular la edad
Publicado por emilo (78 intervenciones) el 19/04/2007 15:13:30
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 punto 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.
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.
Valora esta pregunta


0