Ir para conteúdo
Fórum Script Brasil
  • 0

Calcular Idade


kuroi

Pergunta

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

Editado por kuroi
Link para o comentário
Compartilhar em outros sites

0 respostass a esta questão

Posts Recomendados

Até agora não há respostas para essa pergunta

Participe da discussão

Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.

Visitante
Responder esta pergunta...

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emoticons são permitidos.

×   Seu link foi incorporado automaticamente.   Exibir como um link em vez disso

×   Seu conteúdo anterior foi restaurado.   Limpar Editor

×   Você não pode colar imagens diretamente. Carregar ou inserir imagens do URL.



  • Estatísticas dos Fóruns

    • Tópicos
      152k
    • Posts
      651,8k
×
×
  • Criar Novo...