segunda-feira, 27 de junho de 2011

Idade por extenso no PostgreSQL

Desenho da cabeça de um elefante na cor azul com bordas pretas

Olá papeiros.

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 papeiros.

Clique aqui e veja todas as matérias sobre PostgreSQL

Nenhum comentário:

Postar um comentário