Função para retornar o Tempo em anos, meses, dias, minutos e horas
Oracle PL/SQL
Com este artigo pretendo passar para vocês a forma mais completa de ter como retorno a diferença entre duas datas, por exemplo, “a quanto tempo o funcionário está trabalhando nesta empresa?” Essa função utiliza um bloco feito em PL/SQL do Oracle. Esta funcionalidade é baseada em cálculos feito entre as datas e que também permite utilizar mascaras, assim, possibilitando que você tenha o número de anos, meses, dias, minutos e horas de uma maneira geral.
Criando a função
Ao criar esse tipo de função, você estará criando um objeto de banco de dados Oracle que poderá ser acessado por qualquer usuário conectado ao banco, desde que o usuário tenha acesso a consultá-lo.
CREATE OR REPLACE
FUNCTION schema.retorna_tempo
(P_DT_INICIAL IN DATE
,P_MASC IN VARCHAR2 := Null
,P_DT_FINAL IN DATE := Null
)
RETURN VARCHAR2
IS
Type Rec_Tempo Is Record(
Qtd Integer
,str Varchar2(10) );
vIndice Integer := 0;
vMascara Varchar2(60);
vData Date;
vRetorno Varchar2(100);
vCaracter Char(01);
vOculta Boolean := False; -->> False Oculsta, true exibe
vAno Rec_Tempo; -->> Registro que irá armazenar o Ano
vMes Rec_Tempo; -->> Registro que irá armazenar o Mes
vDia Rec_Tempo; -->> Registro que irá armazenar o Dia
vHora Rec_Tempo; -->> Registro que irá armazenar a Hora
vMin Rec_Tempo; -->> Registro que irá armazenar o Minuto
BEGIN
/*A função NVL é utilizada sempre que queremos que um determinado processo seja executado sem falhas, com isso
quando encontra um parametro ou retorno da consulta com a possibilidade de ser nulo, utilizando a função para impedir
que algum erro ocorra.*/
vData := Nvl(P_DT_FINAL,Sysdate);
vMascara := Nvl( P_MASC, 'a' ); /*Estou deixando como mascará default, a de Ano*/
vAno.Qtd := TO_CHAR(vData,'YYYY') - TO_CHAR(P_DT_INICIAL,'YYYY');
IF vData - ADD_MONTHS( Trunc(P_DT_INICIAL), vAno.Qtd * 12 ) < 0 THEN
vAno.Qtd := vAno.Qtd - 1;
END IF;
vMes.Qtd := Trunc(MONTHS_BETWEEN( vData, ADD_MONTHS( P_DT_INICIAL, vAno.Qtd * 12 ) ));
vDia.Qtd := Trunc(vData - ADD_MONTHS( P_DT_INICIAL, (vAno.Qtd * 12) + vMes.Qtd ));
vHora.Qtd := Trunc((vData - (ADD_MONTHS( P_DT_INICIAL, (vAno.Qtd * 12) + vMes.Qtd ) + vDia.Qtd))*24);
vMin.Qtd := Trunc((vData - (ADD_MONTHS( P_DT_INICIAL, (vAno.Qtd * 12) + vMes.Qtd ) + vDia.Qtd))*24*60 - (vHora.Qtd*60));
If vAno.Qtd > 1 Then
vAno.str := 'Anos';
Else
vAno.str := 'Ano';
End If;
If vMes.Qtd > 1 Then
vMes.str := 'Meses';
Else
vMes.str:= 'Mês';
End If;
If vDia.Qtd > 1 Then
vDia.str:= 'Dias';
Else
vDia.str:= 'Dia';
End If;
If vHora.Qtd > 1 Then
vHora.str:= 'Horas';
Else
vHora.str:= 'Hora';
End If;
If vMin.Qtd > 1 Then
vMin.str:= 'Minutos';
Else
vMin.str:= 'Minuto';
End If;
vCaracter := Substr( vMascara, 1, 1 ); -->> Retorna o primeiro caracter da mascara
If vCaracter = '#' Then -->> O primeiro caracter sendo "#" indica que deverá inibir as informações zeradas
vOculta := True;
vIndice := 2;
vCaracter := Substr( vMascara, 2, 1 );
If vCaracter Is Null Then -->> No caso da máscara ter apenas o caracter "#" então a função retornará Null
...
Exibição do post interrompida. Para ler conteúdo completo,
clique aqui