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
Pergunta
kuroi
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:
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: 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: Editado por kuroiLink para o comentário
Compartilhar em outros sites
0 respostass a esta questão
Posts Recomendados
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.