Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Andre Renato

Operações com Datas

Recommended Posts

Colegas,Fiz uma busca no fórum, mas nada que vi me satisfez. Estou precisando calcular a quantidade de anos e meses exatos a partir de uma data de nascimento de uma tabela de pessoas.Até aqui, cheguei nisso:

SELECT p.dtnasc, to_number(SYSDATE - p.dtnasc) / 365 || ' anos' FROM pessoa pWHERE p.nrreg = '18561'

E está retornando isso:24.8182753361237950279046169457128361238 anosComo faço para ele mostrar 24 anos e 10 meses, por exemplo?Aguardo a ajuda de vocêsObrigado!

Compartilhar este post


Link para o post
Compartilhar em outros sites

Opa Andre,

 

tenta fazer com o codigo abaixo e manda se houver algum problema:

 

SELECT p.dtnasc, to_number( To_Number(To_Char(SYSDATE,'yyyy')) - To_Number(To_Char(p.dtnasc,'yyyy'))) / 365 || ' anos',
			 to_number( To_Number(To_Char(SYSDATE,'mm')) - To_Number(To_Char(p.dtnasc,'mm'))) / 12 || ' meses',
FROM pessoa p
WHERE p.nrreg = '18561';

 

http://forum.imasters.com.br/public/style_emoticons/default/assobiando.gif

Compartilhar este post


Link para o post
Compartilhar em outros sites

Opa!Valeu cara! Comecei a quebrar a cabeça aqui e antes de ver seu post eu tinha conseguido algo.Ficou assim:

SELECT p.dtnasc, trunc(to_number(SYSDATE - p.dtnasc) / 365) || ' anos e ' ||round(to_char(substr(SYSDATE - p.dtnasc, 4))) || ' meses'FROM pessoa pWHERE p.nrreg = '18561'

E saiu do jeito que eu queria:24 anos e 9 mesesValeu pela ajuda!Certamente vai servir para muita gente ainda.Abraço!

Compartilhar este post


Link para o post
Compartilhar em outros sites

Então amigos,Essa solução funcionou legal até certo ponto.Se ela pega algum registro que esteja lançado com um algarismo a mais à esquerda, não traz o número de meses correto.E de quebra, parou de funcionar com o registro que eu estava testando e que estava dando certo:

SELECT p.dtnascimento, trunc(to_number(SYSDATE - p.dtnascimento)/365)|| ' anos ' ||round(to_char(substr(SYSDATE - p.dtnascimento, '4'))) || ' meses'|| ' meses'FROM pessoa pWHERE p.nrregistro = '1111961'

Usei a sugestão do Montilla, mas os meses ficaram inconsistentes... eu iria ter que fazer alguma procedure para acertar as inconsistências.Tentei uma solução usando o LTRIM com a finalidade de ele andar posição por posição à esquerda até localizar o ponto decimal, mas ele tá passando direto pelo ponto:

SELECT p.dtnascimento, trunc(to_number(SYSDATE - p.dtnascimento)/365)|| ' anos ' ||ltrim(to_char(to_number(SYSDATE - p.dtnascimento)/365), '.')|| ' meses'FROM pessoa pWHERE p.nrregistro = '1111961'

Alguém me ajuda, please!Valeu!

Compartilhar este post


Link para o post
Compartilhar em outros sites

Andre,

 

O round que você esta usando ele arredonda para mais ou para menos dependendo do resultado...

O trunc arrendonda sempre para menos.

 

Seguinte, como o ano esta certo e os meses está dando inconsistências teste assim:

 

SELECT Decode(p.dtnascimento, trunc(to_number(SYSDATE - p.dtnascimento)/365),1,p.dtnascimento, trunc(to_number(SYSDATE - p.dtnascimento)/365)||' Ano',
p.dtnascimento, trunc(to_number(SYSDATE - p.dtnascimento)/365)||' anos e')
Decode(To_Number(To_Char(SYSDATE,'mm')),1,To_Number(To_Char(SYSDATE,'mm'))||' Mes',To_Number(To_Char(SYSDATE,'mm'))||' Meses')
FROM pessoa p
WHERE p.nrregistro = '1111961'

 

Os decodes são para verificar se o ano e mes for igual a 1 colocar Ano ou Mes

 

http://forum.imasters.com.br/public/style_emoticons/default/thumbsup.gif

Compartilhar este post


Link para o post
Compartilhar em outros sites

Então, não deu certo. Ele dá erro ORA-00932 - Tipos de dados inconsistentes.

Eu eliminei os erros lá, mas não chegou aonde eu preciso mesmo assim.

 

Bom, enquanto você respodia, eu consegui chegar em partes onde eu queria. Eu precisava pegar apenas o conteúdo após o ponto decimal e consegui:

 

SELECT p.dtnascimento, trunc(to_number(SYSDATE - p.dtnascimento)/365)
|| ' anos ' ||
ltrim(to_number(SYSDATE - p.dtnascimento) / 365, trunc(to_number(SYSDATE - p.dtnascimento)/365)|| '.')
|| ' meses'
FROM pessoa p
WHERE p.nrregistro = '1111961'

 

E tá gerando isso:

24 anos 8232386478944698122780314561136478945 meses

 

O meu problema agora tá sendo arrendondar esse número gigante que tá gerando nos meses.

To tentando algumas funções, mas não tá resolvendo.

 

Tem alguma ideia boa?

Compartilhar este post


Link para o post
Compartilhar em outros sites

select (case when Floor(mod(Months_Between(sysdate,to_date('08-aug-1945')),12)) > 0 then

Floor(Months_Between(sysdate,to_date('08-aug-1945'))/12) || ' anos e ' ||

Floor(mod(Months_Between(sysdate,to_date('08-aug-1945')),12)) || ' meses '

else

Floor(Months_Between(sysdate,to_date('08-aug-1945'))/12) || ' anos ' end) xxx

from dual

Compartilhar este post


Link para o post
Compartilhar em outros sites

Graaaaaaande Motta!Você não sabe o quanto eu tava quebrando a cabeça com isso e procurando na internet algo que atendesse a minha necessidade!Resolveu meu problema!!!!Valeu, grande abraço!

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.