Jump to content
Fórum Script Brasil
  • 0

Calcular Idade


kuroi

Question

Acho q mta gente já teve dificuldade em calcular corretamente a idade certo?? Resolvi postar essa função depois que vi um tópico onde estavam com dificuldade sobre esse assunto.

O problema é q a funcao DateDiff sempre vai retornar a diferenca do ano menos o ano, desconsiderando os dias.

Ou seja, se o cara nasceu em 02/01/2006 e hj é 01/01/2007, o cara so vai fazer 1 ano amanha, certo?? mas a funcao DateDiff assim:

DateDiff("yyyy", "2006-01-02", "2007-01-01")
vai retornar 1. porque ele calcula 2007 - 2006. A solucao seria calcular por dia e dividir por 365, certo?? certo, mas o problema é q tem anos que tem 366 dias. ai o seu calculo pode não bater. exemplo, o cara nasceu em 01/03/2007 e hj é 29/02/2008 (ano bissexto). ou seja, o DateDiff assim:
DateDiff("d", "2007-03-01", "2008-02-29")
vai retornar 365. ai você divide 365 por 365 e vai resultar 1. mas ele ainda não tem 1 ano. só vai ter 1 ano amanha. Como resolver?? Achei q tivesse algum jeito de calcular pelo DateDiff mesmo, mas não achei nd sobre isso. A solucao q encontrei foi fazer minha propria funcao e contar qtos dias a mais ele viveu. EDITADO (18/03/2011): escrevi uma nova funcao aqui baseada numa ideia q o membro Duduh_Capixaba passou num tópico há uns atras. ela tem um codigo um pouco menor q a minha funcao antiga e faz muito menos processamento. fiz uns testes e parece q funciona legal. se encontrarem qualquer problema, avisem ai:
Public Function CalculaIdade(ByVal datNasc As Date) As Integer
    Dim i As Integer, datHoje As Date
    
    datHoje = Date
    
    CalculaIdade = Year(datHoje) - Year(datNasc)
    
    If Month(datHoje) < Month(datNasc) Then
        CalculaIdade = CalculaIdade - 1
    ElseIf Month(datHoje) = Month(datNasc) Then
        If Day(datHoje) < Day(datNasc) Then
            If Month(datNasc) = 2 And Day(datNasc) = 29 Then
                i = Year(datHoje)
                If Not ((Month(datHoje) = 2 And Day(datHoje) = 28) And Not _
                    (i Mod 4 = 0 And ((Not i Mod 100 = 0) Or i Mod 400 = 0))) Then
                    CalculaIdade = CalculaIdade - 1
                End If
            Else
                CalculaIdade = CalculaIdade - 1
            End If
        End If
    End If
End Function[/code] Se alguém quiser conferir como era a funcao antiga:
[code]Public Function CalculaIdade(datNasc As Date) As Integer
    Dim i As Integer, intBix As Integer, intAno As Integer, datHoje As Date
    
    datHoje = Date
    
    intBix = 0
    
    i = Year(datNasc)
    i = IIf((i Mod 4 = 0 And ((Not i Mod 100 = 0) Or i Mod 400 = 0)) And datNasc <= DateSerial(i, 2, 28), i, i + 1)
    
    intAno = Year(datHoje)
    intAno = IIf((intAno Mod 4 = 0 And ((Not intAno Mod 100 = 0) Or intAno Mod 400 = 0)) And datHoje > DateSerial(intAno, 2, 28), intAno, intAno - 1)
        
    For i = i To intAno
        If i Mod 4 = 0 And ((Not i Mod 100 = 0) Or i Mod 400 = 0) Then
            intBix = intBix + 1
            Exit For
        End If
    Next
    For i = i + 4 To intAno Step 4
        If (Not i Mod 100 = 0) Or i Mod 400 = 0 Then
            intBix = intBix + 1
        End If
    Next
    
    CalculaIdade = (DateDiff("d", datNasc, datHoje) - intBix) \ 365
End Function

Edited by kuroi
Link to comment
Share on other sites

0 answers to this question

Recommended Posts

There have been no answers to this question yet

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Answer this question...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.



  • Forum Statistics

    • Total Topics
      152k
    • Total Posts
      651.6k
×
×
  • Create New...