Olá, hoje vou demonstrar como criar uma função para retornar a idade ou um intervalo de data por extenso no PostgreSQL, então mãos a massa.Vamos criar uma stored procedure com os seguintes parâmetros de entrada:
Nome: p_dt_inicial | Tipo timestamp
Nome: p_dt_final | Tipo timestamp
CREATE OR REPLACE FUNCTION paposql.idade_extenso
(p_dt_inicial timestamp
,p_dt_final timestamp)
RETURNS varchar As
$body$
DECLARE
-- Declarando as variaveis que iram montar o retorno por extenso
-- Por padrao eu seto todos os valores com 0 (zero)
v_ano bigint := 0;
v_mes bigint := 0;
v_dia bigint := 0;
v_hora bigint := 0;
v_minuto bigint := 0;
v_segundo bigint := 0;
v_retorno varchar := '';
Begin
-- Extraindo a diferenca entre os periodos para cada variavel
v_ano := Extract(Year From Age(p_dt_inicial, p_dt_final));
v_mes := Extract(Month From Age(p_dt_inicial, p_dt_final));
v_dia := Extract(Day From Age(p_dt_inicial, p_dt_final));
v_hora := Extract(Hour From Age(p_dt_inicial, p_dt_final));
v_minuto := Extract(Minute From Age(p_dt_inicial, p_dt_final));
v_segundo := Extract(Second From Age(p_dt_inicial, p_dt_final));
-- Setando o valor de retorno de acordo com a quantidade
If (v_ano > 0) Then
If (v_ano = 1) Then
v_retorno := v_retorno || v_ano || ' ano ';
Else
v_retorno := v_retorno || v_ano || ' anos ';
End If;
End If;
If (v_mes > 0) Then
If (v_mes = 1) Then
v_retorno := v_retorno || v_mes || ' mês ';
Else
v_retorno := v_retorno || v_mes || ' meses ';
End If;
End If;
If (v_dia > 0) Then
If (v_dia = 1) Then
v_retorno := v_retorno || v_dia || ' dia ';
Else
v_retorno := v_retorno || v_dia || ' dias ';
End If;
End If;
If (v_hora > 0) Then
If (v_hora = 1) Then
v_retorno := v_retorno || v_hora || ' h ';
Else
v_retorno := v_retorno || v_hora || ' hs ';
End If;
End If;
If (v_minuto > 0) Then
If (v_minuto = 1) Then
v_retorno := v_retorno || v_minuto || ' min ';
Else
v_retorno := v_retorno || v_minuto || ' min ';
End If;
End If;
If (v_segundo > 0) Then
If (v_segundo = 1) Then
v_retorno := v_retorno || v_segundo || ' segundo ';
Else
v_retorno := v_retorno || v_segundo || ' segundos ';
End If;
End If;
-- Montando o retorno
Return Coalesce(v_retorno,'Agora');
End;
$body$
LANGUAGE 'plpgsql'
VOLATILE
CALLED ON NULL INPUT
SECURITY INVOKER
COST 100;Lembrando que, p_dt_inicial deve ser o final do intervalo e p_dt_final o início do intervalo, meio estranho mas é para retornar os valores de maneira correta, caso queira mudar, é só renomear o nome dos parâmetros.
O retorno para o seguinte intervalo: now() – 01/01/2000 será: 11 anos 5 meses 26 dias 17 hs 33 min 1 segundo.
Abraços, e até a próxima.
