sql >> Base de Datos >  >> RDS >> Oracle

consulta de Oracle para agrupar la diferencia de fecha por hora

Básicamente, para resolver esto solo necesitas una lista de números.

with nums as (
      select 0.0 as n from dual
      union all
      select n + 1
      from nums
      where n < 100
    )
select trunc(t.startdate + n * 1/ 24, 'hh'),
       sum((case when trunc(t.startdate + n * 1/24, 'hh') = trunc(t.startdate, 'hh')
                 then 60 - extract(minute from startdate)
                 else 0
            end) +
           (case when trunc(t.startdate + n * 1/24, 'hh') > trunc(t.startdate, 'hh') and
                      trunc(t.startdate + n * 1/24, 'hh') < trunc(t.enddate, 'hh')
                 then 60
                 else 0
            end) +
           (case when trunc(t.startdate + n * 1/24, 'hh') = trunc(t.enddate, 'hh')
                 then extract(minute from enddate)
                 else 0
            end)
           ) as minutes
from table t join
     nums n
     where trunc(t.startdate + n * 1/24, 'hh') <= t.enddate;

Esto funciona para hasta 100 horas de diferencia en las fechas. Puede ajustar el 100 para sus necesidades Incluso puede usar una subconsulta para obtener el valor máximo correcto.

Hay algunos trucos que pueden simplificar la lógica. Creo que la lógica anterior es más clara. Recorre las horas. Si la hora comparada es la primera hora, utilice 60 - minutos. Si es el último, utiliza los minutos. De lo contrario, use 60.