Notice: Function _load_textdomain_just_in_time was called incorrectly. Translation loading for the breadcrumb-navxt domain was triggered too early. This is usually an indicator for some code in the plugin or theme running too early. Translations should be loaded at the init action or later. Please see Debugging in WordPress for more information. (This message was added in version 6.7.0.) in /home/devtools/public_html/blog/wp-includes/functions.php on line 6131

Deprecated: A função WP_Dependencies->add_data() foi chamada com um argumento que está obsoleto desde a versão 6.9.0! Os comentários condicionais do IE são ignorados por todos os navegadores compatíveis. in /home/devtools/public_html/blog/wp-includes/functions.php on line 6131
Idade por extenso no PostgreSQL

Idade por extenso no PostgreSQL

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.

Deixe um comentário