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