Pada dasarnya, untuk menyelesaikan ini, Anda hanya perlu daftar angka.
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;
Ini bekerja hingga 100 jam perbedaan tanggal. Anda dapat menyesuaikan 100
untuk kebutuhan Anda. Anda bahkan dapat menggunakan subquery untuk mendapatkan nilai maksimum yang tepat.
Ada beberapa trik yang bisa menyederhanakan logika. Saya pikir logika di atas paling jelas. Ini siklus melalui jam. Jika jam yang dibandingkan adalah jam pertama, gunakan 60 - menit. Jika terakhir, gunakan menit. Jika tidak, gunakan 60.