CONVERTER DATA EM IDADE
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.
Boa noite.
Esse código deve servir para solucionar o problema:
OBS.: essa QUERY é para ser utilizada no SQL Server.
JSFF77
www.visualgria.com.br
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
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
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.
Já com o Access como diz o JSFF77 não deu certo.
Vou tentar com o Firebird.
Faz um loop para atualizar todos os registros cadastrados.
Simples assim, agora é só adaptar no seu código;
[ô]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;
CARLESTON
Vou fazer o teste
Grato
Vou fazer o teste
Grato
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:
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
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:
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
Estou usando MSHFlexGrid
no List Funciona
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
Na sua rotina
Espero ter ajudado
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
Tópico encerrado , respostas não são mais permitidas