CONVERTER DATA EM IDADE

MARCELO.TREZE 29/03/2012 18:43:35
#398720
Nilton não perca tempo fazendo um update, vc pode recisar desta data de nascimento mais adiante, apenas criei uma consulta, que exibe a Idade conforme a data acho mais seguro.


JSFF77 29/03/2012 19:18:15
#398726
Boa noite.

Esse código deve servir para solucionar o problema:

SELECT 
codigo,
nome,
(
YEAR(GETDATE()) - YEAR(data_nascimento) -
(CASE
WHEN MONTH(GETDATE()) < MONTH(data_nascimento) THEN 1
WHEN MONTH(GETDATE()) = MONTH(data_nascimento) AND DAY(GETDATE()) < DAY(data_nascimento) THEN 1
ELSE 0
END)
) AS idade
FROM
tabela


OBS.: essa QUERY é para ser utilizada no SQL Server.


JSFF77
www.visualgria.com.br
NILTON.VIANNA 29/03/2012 20:17:47
#398730

o BD é Firebird,
estou usando assim


rsPaciente.Open [Ô]SELECT Nome, PacienteID, DtaNasc, MedicoID FROM Cad_Paciente06 WHERE Nome LIKE [ô][Ô] & txtPes.Text & [Ô]%[ô]ORDER BY Nome[Ô], CnSql, adOpenKeyset, adLockOptimistic
OMAR2011 29/03/2012 21:12:34
#398732
Cara eu testei com o SqlSer 2008 e deu certo.
Já com o Access como diz o JSFF77 não deu certo.
Vou tentar com o Firebird.
CHARLESTON10 30/03/2012 09:43:00
#398764
Faz um loop para atualizar todos os registros cadastrados.

[ô]Primeiro tera que abrir a tabela a ser editada
rsPaciente.Open [Ô]SELECT Nome, PacienteID, DtaNasc, MedicoID FROM Cad_Paciente06

[ô]Apos fazer um looping para editar todos os registros
[ô]Para isso a tabela tera que ter um campo para guardar a idade

With rsPaciente

Dim sSQL as String [ô]Guardara a instrução SQL
Dim Anos as Integer [ô]Guardara a DatadeNasc convertida em anos

Do While Not .EOF

[ô]Converte a data em anos
Anos = DateDiff([Ô]yyyy[Ô], !DtaNasc, Date)

sSQL = [Ô]UPDATE Cad_Paciente06 SET CampoIdade = [Ô] & Anos

Banco.Execute (sSQL) [ô]Banco de dados executa o comando SQL

loop
end with
rsPaciente.close


Simples assim, agora é só adaptar no seu código;

NILTON.VIANNA 30/03/2012 11:47:41
#398775
CARLESTON

Vou fazer o teste
Grato
MARCELO.TREZE 30/03/2012 12:26:45
#398781
Antes de mais nada aconselho a não alterar a data por idade, pois posteriormente vc pode precisar, por exemplo para verificar o dia em que a pessoa aniversaria, ou crie um campo a mais, (anos), ou apenas exiba a idade baseado na sua consulta.

exemplo:

rsPaciente.Open [Ô]SELECT Nome, PacienteID, DtaNasc, MedicoID FROM Cad_Paciente06 WHERE Nome LIKE [ô][Ô] & txtPes.Text & [Ô]%[ô]ORDER BY Nome[Ô], CnSql, adOpenKeyset, adLockOptimistic
[txt-color=#007100][ô] baseado no que os colegas anteriormente explicaram
[ô] e se retornar mais de uma registro devido ao uso do like
[ô] ficaria conforme abaixo exibindo em um listbox[/txt-color]
Do While Not rsPaciente.EOF
List1.AddItem rsPaciente!Nome & vbTab & DateDiff([Ô]yyyy[Ô], rsPaciente!DtaNasc, Date)
rsPaciente.MoveNext
Loop

ROBIU 31/03/2012 08:17:46
#398850
Se você salvar a idade em uma tabela, vai ter que atualizar o valor a cada aniversário!
Eu não sei porque a dificuldade se é possível [Ô]puxar[Ô] a idade com uma instrução sql. Veja este exemplo para Firebird:
    Dim Sql As String
Sql = [Ô]SELECT Nome, PacienteID, DtaNasc, MedicoID, [Ô]
Sql = Sql & [Ô] trunc(datediff(day,nascimento,current_date)/365.25,0)[Ô]
Sql = Sql & [Ô] FROM Cad_Paciente06 WHERE Nome LIKE [ô][Ô] & txtPes.Text & [Ô]%[ô]ORDER BY Nome[Ô]

rsPaciente.Open Sql, CnSql, adOpenKeyset, adLockOptimistic
NILTON.VIANNA 31/03/2012 10:59:31
#398854

Estou usando MSHFlexGrid
no List Funciona

FFCOUTO 31/03/2012 12:16:41
#398858
Vou concordar com o que o Marcelo disse. Você não precisa atualizar a idade em anos e apenas listar quando necessário.
Abaixo vou passar a rotina que eu uso para calcular idade considerando a data de nascimento e também anos bissextos.

Num Módulo

Option Explicit

Const ANO = 365.2425 [ô]Conforme caledário gregoriano 365 + 1/4 - 1/100 + 1/400
Const MES = 30.4166 [ô]Relação do ano (365 dias) / 12 meses

Public Function AnoBissexto(ByVal AnoRef As Long) As Boolean
[ô]Um ano é bissexto se divisível por 4
[ô]Um ano é bissexto se divisível por 4 e não divisível por 100
[ô]Um ano é bissexto se divisível por 400

AnoBissexto = (((AnoRef Mod 4) = 0) And ((AnoRef Mod 100) <> 0)) Or ((AnoRef Mod 400) = 0)
End Function

Public Function ContarAnosBissextos(ByVal AnoInicio As Long, ByVal AnoTermino As Long) As Long
Dim lContar As Long, i As Long

[ô]Inicializa o contador
lContar = 0

[ô]Verifica o intervalo
For i = AnoInicio To AnoTermino
[ô]Verifica se o ano é bissexto
If AnoBissexto(i) Then lContar = lContar + 1 [ô]Incrementa a contagem
Next

ContarAnosBissextos = lContar
End Function

Public Function CalcularIdade(ByVal DataNascimento As Date, Optional ByVal Abreviar As Boolean = False) As String
Dim a As Long, m As Integer, d As Integer
Dim a1 As Long, a2 As Integer, b As Integer
Dim dias As Long
Dim sRet As String
Dim i As Integer

[ô]Calcula a diferença de dias entre a data de nascimento e hoje
dias = DateDiff([Ô]d[Ô], DataNascimento, Now)

[ô]Inicializa as variáveis
a1 = Year(DataNascimento) [ô]Armazena o ano da data de nascimento
a2 = Year(Now) [ô]Armazena o ano da data atual

[ô]Conta a quantidade de anos bissextos no intervalo de anos
b = ContarAnosBissextos(a1, a2)

[ô]Subtrai a quantidade de anos bissextos do nº de dias
dias = dias - b

[ô]Correção para quando a data de nascimento for posterior a fevereiro e o ano de nascimento for bissexto
If AnoBissexto(Year(DataNascimento)) And Month(DataNascimento) > 2 Then dias = dias + 1

a = dias \ ANO [ô]Calcula o n.º de anos
m = Int((dias Mod ANO) / MES) [ô]Calcula o n.º de meses
d = RestoDivisao(dias, MES) [ô]Calcula o n.º de dias

[ô]Monta o resultado da função
sRet = [Ô][Ô]
If a > 0 Then sRet = a & IIf(Abreviar, [Ô]a [Ô], [Ô]ano(s) [Ô])
If m > 0 Then sRet = sRet & m & IIf(Abreviar, [Ô]m [Ô], [Ô]mês(es) [Ô])
If d > 0 Then sRet = sRet & d & IIf(Abreviar, [Ô]d [Ô], [Ô]dia(s) [Ô])

[ô]Retorna o valor da função
CalcularIdade = sRet
End Function

Public Function RestoDivisao(ByVal Dividendo As Double, ByVal Divisor As Double) As Long
RestoDivisao = Int(Dividendo - (Int(Dividendo / Divisor) * Divisor))
End Function


Na sua rotina

Dim idade As String

Do While Not rsPaciente.EOF
idade = CalcularIdade(r([Ô]DtaNasc[Ô]), True)
List1.AddItem rsPaciente!Nome & vbTab & idade
rsPaciente.MoveNext
Loop



Espero ter ajudado



Página 2 de 3 [27 registro(s)]
Tópico encerrado , respostas não são mais permitidas