sql >> Database >  >> RDS >> Oracle

Oracle-query om datumverschil per uur te groeperen

Kortom, om dit op te lossen heb je alleen een lijst met getallen nodig.

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;

Dit werkt tot 100 uur verschil in de data. U kunt de 100 . aanpassen voor uw behoeften. U kunt zelfs een subquery gebruiken om de juiste maximale waarde te krijgen.

Er zijn enkele trucs die de logica kunnen vereenvoudigen. Ik denk dat bovenstaande logica het duidelijkst is. Het fietst door de uren. Als het vergeleken uur het eerste uur is, gebruik dan 60 minuten. Gebruik in het laatste geval de minuten. Gebruik anders 60.



  1. Hoe elke rij te selecteren waar de kolomwaarde NIET verschillend is

  2. Waarom hebben we berichtenmakelaars zoals RabbitMQ nodig boven een database zoals PostgreSQL?

  3. Zoekopdracht om werknemers te vinden die meer dan hun in aanmerking komende verlof hebben opgenomen met betrekking tot hun functierollen

  4. Hoe maak je een kolom uniek in SQL?