По принцип, за да решите това, ви трябва просто списък с числа.
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;
Това работи за до 100 часа разлика в датите. Можете да коригирате 100
за вашите нужди. Можете дори да използвате подзаявка, за да получите точната максимална стойност.
Има някои трикове, които могат да опростят логиката. Мисля, че горната логика е най-ясна. Цикълира през часовете. Ако сравненият час е първият час, използвайте 60 минути. Ако е последното, използвайте минутите. В противен случай използвайте 60.