मूल रूप से, इसे हल करने के लिए आपको केवल संख्याओं की एक सूची चाहिए।
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 का उपयोग करें।