Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Bases de datos > Tablas planas
Registrarse FAQ Miembros Calendario Guía de estilo Buscar Temas de Hoy Marcar Foros Como Leídos

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 24-07-2003
ajum ajum is offline
Registrado
 
Registrado: jul 2003
Ubicación: Colombia
Posts: 9
Poder: 0
ajum Va por buen camino
Red face como calcular la edad de un usuario

Hola,

Quisiera saber como calcular la edad de un usuario, he leido algunas respuestas y puedo ver que se resta el año actual con al año del nacimiento del usuario y asi tengo la edad, mi problema es que no se con que funcion tomar el año actual y como tomar el año de nacimiento del usuario ya que en el campo de mi BD esta con el siguiente formato 18/05/1977.

Despues de esto necesito es guardarlo en una variable, para asi mostrarlo con un Showmessage.

Bueno,

Saludos,
Ajum.
Responder Con Cita
  #2  
Antiguo 24-07-2003
Avatar de delphi.com.ar
delphi.com.ar delphi.com.ar is offline
Federico Firenze
 
Registrado: may 2003
Ubicación: Buenos Aires, Argentina *
Posts: 5.932
Poder: 26
delphi.com.ar Va por buen camino
Restar años no es una solución válida para calcular edades. Proque no es lo mismo alguien que nació el 1/1/1980 con alguien del 1/05/1980, pese que pertenecen al mismo año si lo comparas el 1/4 del 1/6.

Edad := Trunc((Date - FechaNacimiento) / 365.25)
__________________
delphi.com.ar

Dedique el tiempo suficiente para formular su pregunta si pretende que alguien dedique su tiempo en contestarla.
Responder Con Cita
  #3  
Antiguo 25-07-2003
Avatar de jachguate
jachguate jachguate is offline
Miembro
 
Registrado: may 2003
Ubicación: Guatemala
Posts: 6.254
Poder: 27
jachguate Va por buen camino
Lo que te dice delphi.com.ar sera un buen aproximado, pero la edad exacta la obtenes con:

Código:
Function Edad(FechaNacimiento : TDateTime) : Integer;

Var
  an, mn, dn : Word;
  ahoy, mhoy, dhoy : Word;

Begin
  DecodeDate(FechaNacimiento, an, mn, dn);
  DecodeDate(Now, ahoy, mnoy, dhoy);
  if (mhoy * 100 + dhoy) > (mn * 100 + dn)
    Then Result := an - dn
  else
     Result := an - dn + 1; 
End;
hasta luego

__________________
Juan Antonio Castillo Hernández (jachguate)
Guía de Estilo | Etiqueta CODE | Búsca antes de preguntar | blog de jachguate
Responder Con Cita
  #4  
Antiguo 25-07-2003
Avatar de marcoszorrilla
marcoszorrilla marcoszorrilla is offline
Capo
 
Registrado: may 2003
Ubicación: Cantabria - España
Posts: 11.221
Poder: 10
marcoszorrilla Va por buen camino
Según mis cálculos no funciona, yo le haría los siguientes cambios.

Código:
procedure TForm1.Button1Click(Sender: TObject);
var
Nacimiento:Tdate;
begin
nacimiento:=EncodeDate(1975,7,1);
ShowMessage(IntToStr(Edad(nacimiento)));
end;

Function Edad(FechaNacimiento : TDate) : Integer;
Var
  an, mn, dn : Word;
  ahoy, mhoy, dhoy : Word;
Begin
  DecodeDate(FechaNacimiento, an, mn, dn);
  DecodeDate(Now, ahoy, mhoy, dhoy);

  If  (mn > mhoy) or((mn = mhoy) and (dn > dhoy)) then
   Result:=ahoy - an - 1
  else
   Result:=ahoy - an;
End;
Un Saludo.

Última edición por marcoszorrilla fecha: 25-07-2003 a las 12:41:49.
Responder Con Cita
  #5  
Antiguo 25-07-2003
Avatar de delphi.com.ar
delphi.com.ar delphi.com.ar is offline
Federico Firenze
 
Registrado: may 2003
Ubicación: Buenos Aires, Argentina *
Posts: 5.932
Poder: 26
delphi.com.ar Va por buen camino
Bueno, me han herido la moral , y por eso hice esta comprobación:
Código:
function DelphiComAr(AFechaNacimiento: TDateTime) : Integer;
begin
  Result := Trunc((Date - AFechaNacimiento) / 365.25);
end;

function JachGuate(FechaNacimiento : TDateTime) : Integer;
var
  an, mn, dn : Word;
  ahoy, mhoy, dhoy : Word;
begin
  DecodeDate(FechaNacimiento, an, mn, dn);
  DecodeDate(Now, ahoy, mhoy, dhoy);
  if (mhoy * 100 + dhoy) > (mn * 100 + dn) Then
     Result := an - dn
  else
     Result := an - dn + 1;
end;

function MarcosZorrilla(FechaNacimiento : TDate) : Integer;
Var
  an, mn, dn : Word;
  ahoy, mhoy, dhoy : Word;
Begin
  DecodeDate(FechaNacimiento, an, mn, dn);
  DecodeDate(Now, ahoy, mhoy, dhoy);

  If  (mn > mhoy) or((mn = mhoy) and (dn > dhoy)) then
   Result:=ahoy - an - 1
  else
   Result:=ahoy - an;
End;


procedure TForm1.Button1Click(Sender: TObject);
var
  ADate : TDateTime;
  i,
  ADelphi,
  AJach,
  AMarcos: Integer;
begin
  ADate := StrToDate('01/01/1900');
  repeat
    ADelphi := DelphiComAr(ADate);
    AJach   := JachGuate(ADate);
    AMarcos := MarcosZorrilla(ADate);
    {He comentado la comprobación de la funcion JachGuate}
    if {(ADelphi <> AJach) or} (ADelphi <> AMarcos) {or (AJach <> AMarcos) }Then
       Memo1.Lines.Add(Format('%s - Delphi.com.ar: %4d   JachGuate: %4d   MarcosZorrilla: %4d', [DateToStr(ADate), ADelphi, AJach, AMarcos]));
    ADate := ADate + 1;
  until ADate > Date;
end;
Conclusión: La función de JachGuate evidentemente esta mal, o yo tengo 1996 años , y la de Marcos difiere de la mía en un pequeño detalle, en mi función que es mucho mas sencilla, el día del cumpleaños aún no a sumado un año, en la de marcos el día del cumpleaños ya se ha sumado un año, bueno eso queda a elección del programador.
Si la comprobación se extiende a fechas muy antiguas, falla constantemente, ninguna de las funciones tiene en cuenta el desfasaje del calendario.

Saludos
__________________
delphi.com.ar

Dedique el tiempo suficiente para formular su pregunta si pretende que alguien dedique su tiempo en contestarla.

Última edición por delphi.com.ar fecha: 25-07-2003 a las 15:57:36.
Responder Con Cita
  #6  
Antiguo 25-07-2003
Avatar de marcoszorrilla
marcoszorrilla marcoszorrilla is offline
Capo
 
Registrado: may 2003
Ubicación: Cantabria - España
Posts: 11.221
Poder: 10
marcoszorrilla Va por buen camino
Había probado la de JachGuate, y me fuí corriendo a mirar al espejo, porque tenía más de mil años.

La tuya no había llegado a hacer la prueba, pero me parecía que con la rectificación para los bisiestos no iba a funcionar en algún momento.

Sin embargo, despues de la prueba que propones, me quedo con la tuya, está dentro de mi filosofía, la mejor función es la que emplea menos código.

Bueno en cuanto a la diferencia de un año, como habrás observado yo entiendo que el día del cumpleaños ya se tienen los años cumplidos.

Un Saludo.
Responder Con Cita
  #7  
Antiguo 25-07-2003
Avatar de jachguate
jachguate jachguate is offline
Miembro
 
Registrado: may 2003
Ubicación: Guatemala
Posts: 6.254
Poder: 27
jachguate Va por buen camino
Que tal. Me he dado cuenta del error que cometí, la función funcionaría correctamente asi:

Código:
Function Edad(FechaNacimiento : TDateTime) : Integer;

Var
  an, mn, dn : Word;
  ahoy, mhoy, dhoy : Word;

Begin
  DecodeDate(FechaNacimiento, an, mn, dn);
  DecodeDate(Now, ahoy, mnoy, dhoy);
  if (mhoy * 100 + dhoy) >= (mn * 100 + dn)
    Then Result := ahoy - an
  else
     Result := ahoy - an - 1
End;
Hasta luego
__________________
Juan Antonio Castillo Hernández (jachguate)
Guía de Estilo | Etiqueta CODE | Búsca antes de preguntar | blog de jachguate
Responder Con Cita
  #8  
Antiguo 29-07-2003
ajum ajum is offline
Registrado
 
Registrado: jul 2003
Ubicación: Colombia
Posts: 9
Poder: 0
ajum Va por buen camino
Talking

Una vez mas yo, quiero contarles que me fue muy bien con sus sugerencias, me funcionaron perfectamente segun mi necesidad, el motivo de mi retraso fue una vez mas mi computador, pero eso ya esta solucionado y creo que no volvera a molestar.

Saludos

Responder Con Cita
Respuesta


Herramientas Buscar en Tema
Buscar en Tema:

Búsqueda Avanzada
Desplegado

Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro


La franja horaria es GMT +2. Ahora son las 02:59:51.


Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi
Copyright 1996-2007 Club Delphi