Retorna tempo de um intervalo de datas
SQL:
select --campos individuais
trunc((datafim-datainicio) / 365) totalano,
trunc((datafim-datainicio) / 30) totalmes,
trunc((datafim-datainicio)) totaldia,
trunc(((datafim-datainicio) * 24)) totalhora,
trunc(((datafim-datainicio) * 1440)) totalminuto,
--campo consolidado por extenso
to_char(trunc((datafim-datainicio) / 365)) ||
case when trunc((datafim-datainicio) / 365) <> 1 then ' anos, ' else ' ano, ' end ||
to_char(trunc((datafim-datainicio) / 30) - trunc((datafim-datainicio) / 365) * 12) ||
case when (trunc((datafim-datainicio) / 30) - trunc((datafim-datainicio) / 365) * 12) <> 1 then ' meses, ' else ' mês, ' end ||
to_char(trunc((datafim-datainicio)) - trunc((datafim-datainicio) / 30) * 30) ||
case when (trunc((datafim-datainicio)) - trunc((datafim-datainicio) / 30) * 30) <> 1 then ' dias, ' else ' dia, ' end ||
to_char(trunc(((datafim-datainicio) * 24)) - trunc((datafim-datainicio)) * 24) ||
case when (trunc(((datafim-datainicio) * 24)) - trunc((datafim-datainicio)) * 24) <> 1 then ' horas e ' else ' hora e ' end ||
to_char(trunc(((datafim-datainicio) * 1440)) - trunc(((datafim-datainicio) * 24)) * 60) ||
case when (trunc(((datafim-datainicio) * 1440)) - trunc(((datafim-datainicio) * 24)) * 60) <> 1 then ' minutos' else ' minuto' end extenso
--atribuir data início e data fim
from (select to_date('01/01/2018 00:00', 'dd/mm/yyyy hh24:mi') datainicio,
to_date('22/07/2019 00:42', 'dd/mm/yyyy hh24:mi') datafim
from dual)
Retorno:
| TOTALANO | TOTALMES | TOTALDIA | TOTALHORA | TOTALMINUTO | EXTENSO |
------------------------------------------------------------------------------------------------------------
| 1 | 18 | 567 | 13608 | 816522 | 1 ano, 6 meses, 27 dias, 0 horas e 42 minutos |