Ir para o conteúdo principal

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 |