Cálculo da idade em meses e dias

Fórum sobre a linguagem CA-Clipper.

Moderador: Moderadores

simoreira
Usuário Nível 1
Usuário Nível 1
Mensagens: 40
Registrado em: 20 Ago 2004 16:21

Cálculo da idade em meses e dias

Mensagem por simoreira »

Pessoal!

Necessito de uma fórmula para, informadas duas datas, calcular a idade em meses e dias. Por exemplo: Data Base: 01/09/2004 e Data nascimento 02/09/2003. A idade correta seria 8 meses e 29 dias. :?
Avatar do usuário
Daniel
Usuário Nível 3
Usuário Nível 3
Mensagens: 373
Registrado em: 13 Ago 2003 22:42
Localização: Apucarana - PR

Mensagem por Daniel »

eu fiz isto anos atraz usa lib catools

Código: Selecionar todos

Set Date To British
Set Epoch to 1950
Set Century On
While .t.
   cls
   xdata:= date()
   xnasc:= CToD(Space(8))
   @ 12, 10 Say "Data de Nascimento:" Get xnasc
   @ 14, 10 Say "Data Base.........." get xdata
   Read
   If LastKey() == 27
      Exit
   EndIf
   x6:= xdata - xnasc
   x9:= x8:= x5:= 0
   x11:= xnasc
   While x6 >= 365
      If isleap(x11) //verefica se o ano e bissesto
         If x6 > 0
           xc:= 366
           x6-= xc
           x11+= xc
           x8 ++
         EndIf
      Else
        If x6 > 0
            xc:= 365
            x6-= xc
            x11+= xc
            x8 ++
         EndIf
      EndIf
      If x6 < 0
         x6+= xc
         x8 --
         Exit
      EndIf
   End
   xa:= Day(xnasc)
   xd:= Day(xdata)
   ? StrZero(x8, 2) + " Anos"
   x7:= Int(x6 / 30)
   x20:= AddMonth(xdata , -x7) // diminui os meses
   If x6 >= 30
      While .t.
         x5++
         x2:= x20 + x5
         x3:= lastdayom(x2) //verefica se o mes e 30 ou 31 dias
         x6-= x3
         If x6 < 0
            x6+= x3
            x9:= x6
            x5--
            Exit
         EndIf
      End
   EndIf
   ?  StrZero(x5, 2) + " Meses"
   If x6 >= 0
      x9:= xd - xa
      If x9 < 0
         x9:= 30 - (x9 * -1)
      EndIf
   Else
      x9:= x6
   EndIf
   ? StrZero(x9, 2) + " Dias"
   Inkey(0)
End

Daniel

Harbour + Minigui + dbfcdx
Marinas-Gui Pena que parou o suporte
simoreira
Usuário Nível 1
Usuário Nível 1
Mensagens: 40
Registrado em: 20 Ago 2004 16:21

Mensagem por simoreira »

Daniel,

Muitíssimo obrigado. Precisando, estou às dordens.

Sérgio.
Softwhouse
Usuário Nível 3
Usuário Nível 3
Mensagens: 324
Registrado em: 07 Dez 2011 18:44
Localização: Porto Alegre/RS

Cálculo da idade em meses e dias

Mensagem por Softwhouse »

Esta rotina apresenta um bug. Se digitar a data de nascimento 20/10/2020 e a data base 20/10/2021 calcula errado. Alguém teria essa função funcionando ?
Fernando
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

Cálculo da idade em meses e dias

Mensagem por JoséQuintas »

Código: Selecionar todos

FUNCTION Idade( dDataNasc, dDataCalc )

   LOCAL nDias, nMeses, nAnos

   hb_Default( @dDataCalc, Date() )
   IF Dtoc( dDataNasc ) == "  /  /  "
      RETURN "*Indefinido*"
   ENDIF
   nAnos := Year( dDataCalc ) - Year( dDataNasc )
   IF Substr( Dtos( dDataCalc ), 5 ) < Substr( Dtos( dDataNasc ), 5 )
      nAnos := nAnos - 1
   ENDIF
   nMeses := ( 12 - Month( dDataNasc ) ) + Month( dDataCalc )
   DO CASE
   CASE Day( dDataCalc ) = Day( dDataNasc )
      nDias := 0
   CASE Day( dDataCalc ) < Day( dDataNasc )
      nMeses := nMeses - 1
      nDias  := Day( Last_Day( dDataNasc ) ) - Day( dDataNasc ) + Day( dDataCalc )
   OTHERWISE
      nDias := Day( dDataCalc ) - Day( dDataNasc )
   ENDCASE
   nMeses = Mod( nMeses, 12 )

   RETURN LTrim( Str( nAnos, 3 ) ) + " ano(s), " + LTrim( Str( nMeses, 3 ) ) + " mes(es), " + LTrim( Str( nDias, 3 ) ) + " dia(s)"

José M. C. Quintas
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

Cálculo da idade em meses e dias

Mensagem por JoséQuintas »

Precisa desta

Código: Selecionar todos

FUNCTION Last_Day( dData )

   dData += ( 40 - Day( dData ) )
   dData -= Day( dData )

   RETURN dData
José M. C. Quintas
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
Softwhouse
Usuário Nível 3
Usuário Nível 3
Mensagens: 324
Registrado em: 07 Dez 2011 18:44
Localização: Porto Alegre/RS

Cálculo da idade em meses e dias

Mensagem por Softwhouse »

Perfeito Quintas, funcionou corretamente. Função super enxuta e compilada com -w3 -es2.
Muito obrigado.
Fernando
Responder