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.