Função para calcular a idade por uma data de nascimento

Oracle

21/05/2014

Meus amigos, como que faço uma função para calcular a idade pela data de nascimento? Preciso buscar pelo id.
Frederico Brigatte***

Frederico Brigatte***

Curtidas 0

Respostas

Marisiana Battistella

Marisiana Battistella

21/05/2014

Olá Frederico!
Encontrei esse exemplo na web, mas não sei se funciona pois estou sem o Oracle aqui pra testar...
SELECT
trunc((months_between(sysdate, to_date('25/01/1987','dd/mm/yyyy')))/12) AS idade
FROM DUAL

[url]http://allanfreitas.com.br/banco-de-dados/calcular-idade-pela-data-de-nascimento-no-oracle[/url]

Espero que funcione....
GOSTEI 0
Frederico Brigatte***

Frederico Brigatte***

21/05/2014

e como que posso fazer com parâmetro?
GOSTEI 0
Marisiana Battistella

Marisiana Battistella

21/05/2014

Digamos que você vá calcular, por exemplo, a idade de um cliente...
SELECT trunc((months_between(sysdate, to_date(c.dt_nascimento,'dd/mm/yyyy')))/12) AS idade
FROM cliente c
WHERE c.cod_cliente = v_codigo

Pela lógica seria assim. Testa aí pra ver se funciona...
GOSTEI 0
Frederico Brigatte***

Frederico Brigatte***

21/05/2014

Como seria numa função?
GOSTEI 0
Deivison Melo

Deivison Melo

21/05/2014

Simples assim:

create or replace function RetornaIdade(pData In Date) return number is
cursor cData(pData in Date) is
SELECT trunc((months_between(sysdate, pData))/12) idade
FROM DUAL;
vcData cData%rowtype;
begin
open cData(pData);
fetch cData into vcData;
close cData;

return vcData.idade;
end;
GOSTEI 0
Deivison Melo

Deivison Melo

21/05/2014

Estou sem oracle aqui na máquina, então não testei...

Qualquer erro por favor me comunicar!!!
GOSTEI 0
Frederico Brigatte***

Frederico Brigatte***

21/05/2014

Como seria a chamada da função? Ela recebe um parâmetro?
GOSTEI 0
Marisiana Battistella

Marisiana Battistella

21/05/2014

Se você precisa que a data seja calculada buscando pelo ID, a tua function vai ter que receber esse ID por parâmetro, executar o select que t passei no segundo exemplo e retornar a idade que foi calculada....
GOSTEI 0
Frederico Brigatte***

Frederico Brigatte***

21/05/2014

E no exemplo do Deivison, como seria a chamada? Está recebendo parâmetro?
GOSTEI 0
Marisiana Battistella

Marisiana Battistella

21/05/2014

pData In Date

Indica que a function recebe uma data como parâmetro...
GOSTEI 0
Frederico Brigatte***

Frederico Brigatte***

21/05/2014

E como que faço a chamada disso passando o parâmetro?
GOSTEI 0
Marisiana Battistella

Marisiana Battistella

21/05/2014

Tua function terá que ficar mais ou menos assim:

CREATE FUNCTION calcula_idadel(in_codigo IN NUMBER) 
   RETURN NUMBER 
   IS 
        v_idade NUMBER(11);
   BEGIN 
       
        SELECT trunc((months_between(sysdate, to_date(c.dt_nascimento,'dd/mm/yyyy')))/12) 
        INTO v_idade
        FROM cliente c
        WHERE c.cod_cliente = in_codigo;
        RETURN(v_idade); 

    END;


Ela recebe o código como parâmetro e retorna a idade calculada a partir da data de nascimento que está cadastrada...
Eu não cheguei a testar se funciona porque não tenho o Oracle aqui no meu PC, peguei exemplos na web e construi a função.
Mas logicamente seria assim, você apenas precisa adaptar ela a realidade que vc está trabalhando.
GOSTEI 0
Marisiana Battistella

Marisiana Battistella

21/05/2014

Se você quiser entender um pouco mais sobre parâmetros em functions e procedures, neste link tem uma explicação:
[url]http://plsql-tutorial.com/plsql-passing-parameters-procedure-function.htm[/url]
E neste outro link tem uma explicação de como é a estrutura de uma function: [url]http://plsql-tutorial.com/plsql-functions.htm[/url]
GOSTEI 0
Frederico Brigatte***

Frederico Brigatte***

21/05/2014

Da pra usar isso com php? Como que ficaria a chamada, é esse exemplo que quero saber. Me desculpe, não me expressei bem.
GOSTEI 0
Marisiana Battistella

Marisiana Battistella

21/05/2014

Sim dá pra usar no PHP...
Você vai ter que criar essa função no Oracle e chamá-la no PHP passando o código como parâmetro
Um exemplo que já utilizei...
function funCalculaIdade($app, $codigo){
	$r = db($app, "F", "nome_schema.fun_calculaidade", $codigo);
	return $r;
}


$app é a variável que contém as configurações de conexão com o Oracle.


GOSTEI 0
Frederico Brigatte***

Frederico Brigatte***

21/05/2014

E como é a chamada da função no Oracle pelo php?
GOSTEI 0
Marisiana Battistella

Marisiana Battistella

21/05/2014

Você já criou a conexão com o BD do Oracle no PHP?
GOSTEI 0
Frederico Brigatte***

Frederico Brigatte***

21/05/2014

Não, podia me ensinar como faz? Nunca mexi com oracle. E onde posso baixar free?
GOSTEI 0
Frederico Brigatte***

Frederico Brigatte***

21/05/2014

Baixei esse oracle, OracleXE112_Win32.zip

É free? Tem algum tempo de utilização?
GOSTEI 0
Deivison Melo

Deivison Melo

21/05/2014

Vc poderá usar a função da seguinte forma:
Função:
create or replace function RetornaIdade(pData In Date) return number is
cursor cData(pData in Date) is
SELECT trunc((months_between(sysdate, pData))/12) idade
FROM DUAL;
vcData cData%rowtype;
begin 
open cData(pData);
fetch cData into vcData;
close cData;

return vcData.idade;
end;


Usando no bloco anônimo oracle:
declare
    DataInformada date;
    DataRetornada date; 
begin
   DataRetornada:=RetornaIdade(DataInformada);
end;


Modo simplificado de uso via query:

   select RetornaIdade(DataInformada) 
     from dual	


Caso for usar a função confeccionada pela Marisiana, modificar adicionando o exception:

CREATE FUNCTION calcula_idadel(in_codigo IN NUMBER) 
   RETURN NUMBER 
   IS 
        v_idade NUMBER(11);
   BEGIN 
        
        SELECT trunc((months_between(sysdate, to_date(c.dt_nascimento,'dd/mm/yyyy')))/12) 
        INTO v_idade
        FROM cliente c
        WHERE c.cod_cliente = in_codigo;
        RETURN(v_idade); 
   exception
	whe others then
	   v_idade:=null;
   END;


PS. Ao usar oracle, principalmente se trabalhar em uma empresa que adote objetos de banco (procedures, functions, packages), comece a confeccionar os objetos com a utilização de cursores, pois se o retorno for nulo, não será
apresentado erros no seu código, só utilize select into se tiver certeza de que o retorno nunca será nulo, o select into é recomendado para uso de informações que sempre hajam retorno, por ser a forma mais rápida de recuperação de um registro.

Qualquer dúvida estou à disposição!

Emanoel Deivison
Recife - PE
GOSTEI 0
Frederico Brigatte***

Frederico Brigatte***

21/05/2014

Pera ae que não to entendendo nada, rs. Como que uso isso com php, por exemplo?
GOSTEI 0
Gvdasa Sistemas

Gvdasa Sistemas

21/05/2014

No SQLSERVER:

Create Function Idade (@datanascimento datetime)
Returns Int
As
Begin
Declare @idade Int

set @idade = DATEDIFF(year, @datanascimento, getdate())

Return @idade
End

-- onde @datanascimento é a coluna da tabela, que contém a data de nascimento.
GOSTEI 0
POSTAR