Ajuda com atualização de dada somente no SQL.

Firebird

19/10/2009

Olá.

A situação é a seguinte.

Tenho:
ID do USUARIO;
Data de Nascimento;

e o campo Idade.

Queria atualizar este campo somente utilizando comandos SQL. Eu forneceria a data atual e ele atualizaria.

Preciso desta data no banco de dados e atualizada.

Obrigado.


Cb

Cb

Curtidas 0

Respostas

Cb

Cb

19/10/2009

Esqueci de falar. Uso Firebird.


GOSTEI 0
Rweberich

Rweberich

19/10/2009

Ola amigo,
faz o seguinte: capture essa ano da data que esta no banco, carregue em uma variavel, e depois manipule a idade de acordo com o ano corrente;

Pra capturar o ano da data de nascimento vc pode fazer da seguinte forma:

Var
dt: TDateTime;
begin
dt := StrToDate (edtData.Text);
DM.qryUsuario.FieldByName(´DATANASCIMENTO´).AsString := FormatDateTime(´yyyy´, dt);
end;


Abraco.


GOSTEI 0
Afarias

Afarias

19/10/2009

|Queria atualizar este campo somente utilizando comandos SQL. Eu
|forneceria a data atual e ele atualizaria.

O campo idade pode ser CALCULADO com base na data atual. Vc pode usar uma UDF ou fazer com comandos suportados pelo FB (dependendo da versão q esteja usando), ex:


SELECT extract(year from current_date)-extract(year from nascimento)-case
when extract(month from current_date)<extract(month from nascimento) or
(extract(month from current_date)=extract(month from nascimento) and
extract(day from current_date)<extract(day from nascimento)) then 0 else 1 end as idade
from sua_tabela

vc pode usar no select ou criar um campo calculado:

alter table minha_tabela add idade computed by ( ...cálculo... );


outra forma mais simples mas apenas aproximada:

select (current_date-data_nasc)/365.25 as idade from sua_tabela


estes são apenas exemplos, existem várias formas de fazer.


T+


GOSTEI 0
Cb

Cb

19/10/2009

Este primeiro eu tentei, mas estranho que o FB não reconhece como instrução...

Vou tentar as outras formas e posto quando terminar.

Obrigado.


GOSTEI 0
Afarias

Afarias

19/10/2009

CASE só funciona no FB 2 e acima (q eu lembre)


T+


GOSTEI 0
Cb

Cb

19/10/2009

Tentei o:
select (current_date-data_nasc)/365.25 as idade from sua_tabela


Ele mostra a idade mas não salva.

O

alter table minha_tabela add idade computed by ( ...cálculo... );


attempt to store duplicate value, já existe o IDADE lá. kekekeke!! Mas isto é de menos, se for preciso eu removo antes de ´atualizar´ a data.

Uma outra questão o FB não está reconhecendo o ´/´

Tentei o

SELECT extract(year from current_date)-extract(year from nascimento)-case when extract(month from current_date)<extract(month from nascimento) or (extract(month from current_date)=extract(month from nascimento) and extract(day from current_date)<extract(day from nascimento)) then 0 else 1 end as idade from sua_tabela


Deu mas sem atualizar ainda. kekeke.

Aguardo qualquer ajuda.

Obrigado novamente.


GOSTEI 0
Cb

Cb

19/10/2009

Desculpem ficar postando seguido, mas não dá pra editar.

O FB só não reconhce o ´/´

dentro do calculo de:

alter table minha_tabela add idade computed by ( ...cálculo... );


Grato.


GOSTEI 0
Afarias

Afarias

19/10/2009

|Ele mostra a idade mas não salva.

Achei q estava CLARO isso. Este é um comando SELECT !! Seu objetivo não é gravar nada!! Pq gravar qualquer coisa se posso calcular na hora??


|attempt to store duplicate value, já existe o IDADE lá. kekekeke!! Mas isto
| é de menos, se for preciso eu removo antes de ´atualizar´ a data.

O erro é pq vc já tem 1 campo com o nome IDADE. Se vai criar um novo campo vc tem q dropar o antigo ou mudar o nome do novo campo!!!!!


|Deu mas sem atualizar ainda.

Novamente. A idéia não é atualizar. [b:7048aa6618]Não faz sentido[/b:7048aa6618] guardar um campo IDADE e mudar todo ano!!! Vc apenas calcula na hora q precisa -- os SELECTS q passei mostram como fazer isso


T+


GOSTEI 0
Cb

Cb

19/10/2009

Consegui resolver seguindo sua ajuda acima. :D

Eu tambem estranhei aquele select com o AS criando a variável atualizar alguma coisa. kekekeke.

Só tiver que fazer uma correção:

SELECT extract(year from current_date)-extract(year from nascimento)-case when extract(month from current_date)<extract(month from nascimento) or (extract(month from current_date)=extract(month from nascimento) and extract(day from current_date)<extract(day from nascimento)) then [b:89cd665ba6]1[/b:89cd665ba6] else [b:89cd665ba6]0[/b:89cd665ba6] end as idade from sua_tabela




Não faz realmente sentido, mas eu não sou o chefe. :P

No principio eu alertei sobre isto, mas alegaram que eu não sei o que foi pedido, ou algo assim. Então...

Eu vou fazer para melhorar uma rotina que assim que ao 1o acesso do dia atualize. Seja o que deus quiser. :lol: :lol: :lol:


GOSTEI 0
Cb

Cb

19/10/2009

Aproveitando.

Se me pedirem depois pra mudar, como eu coloco a idade calculada num dbstringgrid usando delphi 7?

Obrigado pela ajuda.


GOSTEI 0
Afarias

Afarias

19/10/2009

|Só tiver que fazer uma correção:

perfeito!


|Não faz realmente sentido, mas eu não sou o chefe.

:lol:



T+


GOSTEI 0
Cb

Cb

19/10/2009

Aproveitando. Se me pedirem depois pra mudar, como eu coloco a idade calculada num dbstringgrid usando delphi 7? Obrigado pela ajuda.


REspondendo minha própria duvida.

Basta adicionar (<calculo>) as <VARIAVEL>

:D

Obrigado pelo Apoio gente.


GOSTEI 0
Carlos Mazzi

Carlos Mazzi

19/10/2009

Valeu, mais uma vez.. abracos++
GOSTEI 0
POSTAR