Oracle
 sql >> Datenbank >  >> RDS >> Oracle

Oracle-Abfrage, um die Datumsdifferenz nach Stunde zu gruppieren

Um dies zu lösen, benötigen Sie im Grunde nur eine Liste mit Zahlen.

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;

Dies funktioniert für bis zu 100 Stunden Unterschied in den Daten. Sie können 100 anpassen für Ihre Bedürfnisse. Sie können sogar eine Unterabfrage verwenden, um den richtigen Maximalwert zu erhalten.

Es gibt einige Tricks, die die Logik vereinfachen können. Ich denke, die obige Logik ist am klarsten. Es kreist durch die Stunden. Wenn die Vergleichsstunde die erste Stunde ist, verwenden Sie 60 Minuten. Wenn das letzte, verwenden Sie die Minuten. Verwenden Sie andernfalls 60.