sql >> Database teknologi >  >> RDS >> Oracle

oracle-forespørgsel for at gruppere datoforskel efter time

Grundlæggende behøver du blot en liste med tal for at løse dette.

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;

Dette virker i op til 100 timers forskel på datoerne. Du kan justere 100 til dine behov. Du kan endda bruge en underforespørgsel for at få den rigtige maksimale værdi.

Der er nogle tricks, der kan forenkle logikken. Jeg tror, ​​at ovenstående logik er klarest. Det cykler gennem timerne. Hvis den sammenlignede time er den første time, skal du bruge 60 - minutter. Hvis det sidste, så brug minutterne. Ellers skal du bruge 60.



  1. Konverteringen af ​​en varchar-datatype til en datetime-datatype resulterede i en værdi uden for området

  2. Sådan opretter du indlejret tabel som databaseobjekt i Oracle

  3. python og mysql på mac os x

  4. mysql_ping hænger sammen med Amazon RDS