Translate

terça-feira, 26 de abril de 2016

Banco Oracle - Verificando Tempo Transcorrido


Podemos eventualmente, necessitar contar o tempo transcorrido entre dois valores de campos distintos de uma tabela (DATA_FINAL - DATA_INICIAL) ou determinado tempo passado até a data atual.

No Banco Oracle podemos utilizar de alguns artifícios para conseguirmos esta solução.

Utilizarei as tabelas e dados criados no post anterior:

Banco Oracle - Adicionando valores de tempo em Datas TIMESTAMP


Observação: Utilize o comando abaixo para ajustar o formato de hora para a sessão, a fim de evitarmos problemas de conversão:

--necessario alterar a sessao, utilizo aqui o formato 'DD/MM/YYYY HH24:MI:SS'
       ALTER SESSION SET NLS_DATE_FORMAT = 'DD/MM/YYYY HH24:MI:SS';

Baseando-se que já tenhamos uma tabela e uma pequena massa de dados na mesma, podemos executar a seguinte consulta, calculando a subtração do tempo transcorrido entre a data atual (SYSTIMESTAMP) e a data registrada no campo DATA1:


--demonstra valor de data 1 e suas diferencas                         
SELECT ID_TESTE
      ,SYSTIMESTAMP AS DATA_ATUAL
      ,DATA1
      ,(SYSTIMESTAMP --DATA ATUAL
        -
        DATA1
        ) AS DIFERENCA_ENTRE_DATAS
            FROM TESTES_COM_DATA;  


Obtendo um resultado semelhante ao demonstrado na figura:










Observe o campo DIFERENCA_ENTRE_DATAS. É demonstrado, dias/horas/minutos/segundos.

Mas e se desejarmos saber apenas os minutos transcorridos?

Podemos usar a cláusula WITH e a partir de um sub-query semelhante à demonstrada acima, extrair os valores desejados, no caso, os minutos transcorridos desde a hora atual até o momento da execução da consulta:
--SELECIONA MINUTOS TRANSCORRIDOS
        WITH DIFERENCA AS (
        --SELECIONA DIFERENCAS ENTRE A DATA ATUAL 
        -- E A DATA REGISTRADA NA TABELA
         SELECT (
              SYSTIMESTAMP --DATA ATUAL ou por ex.:TO_TIMESTAMP('22/04/2016 13:00:00', 'DD/MM/YYYY HH24:MI:SS') 
              -
              DATA1
              ) AS DIFERENCA_ENTRE_DATAS
                  FROM TESTES_COM_DATA                                    
                         )
          --EXTRAI OS MINUTOS
          SELECT (( EXTRACT (DAY FROM (DIFERENCA_ENTRE_DATAS)) *24*60*60 
               + EXTRACT (HOUR FROM (DIFERENCA_ENTRE_DATAS)) *60*60 
               + EXTRACT (MINUTE FROM (DIFERENCA_ENTRE_DATAS)) *60 
               + EXTRACT (SECOND FROM (DIFERENCA_ENTRE_DATAS)) )/60) AS TOTAL
          FROM DIFERENCA;

Observe o resultado


Podemos, através da função  ROUND(<valor>,<casas_decimais>) arredondar este valor: 


--SELECIONA MINUTOS TRANSCORRIDOS
        WITH DIFERENCA AS (
        --SELECIONA DIFERENCAS ENTRE A DATA ATUAL 
        -- E A DATA REGISTRADA NA TABELA
         SELECT (
             SYSTIMESTAMP --DATA ATUAL ou por ex.:TO_TIMESTAMP('22/04/2016 13:00:00', 'DD/MM/YYYY HH24:MI:SS') 
              -
              DATA1
              ) AS DIFERENCA_ENTRE_DATAS
                  FROM TESTES_COM_DATA                                    
                         )
          --EXTRAI OS MINUTOS
          SELECT ROUND((( EXTRACT (DAY FROM (DIFERENCA_ENTRE_DATAS)) *24*60*60 
               + EXTRACT (HOUR FROM (DIFERENCA_ENTRE_DATAS)) *60*60 
               + EXTRACT (MINUTE FROM (DIFERENCA_ENTRE_DATAS)) *60 
               + EXTRACT (SECOND FROM (DIFERENCA_ENTRE_DATAS)) )/60)
               ,0) AS TOTAL_ARREDONDADO -- 0 CASAS DECIMAIS
          FROM DIFERENCA;

Obtendo o resultado em Minutos, como desejávamos:




Nenhum comentário:

Postar um comentário