基本的に、これを解決するには数字のリストが必要です。
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
を調整できます あなたのニーズのために。サブクエリを使用して、正しい最大値を取得することもできます。ロジックを単純化できるいくつかのトリックがあります。上記の論理が最も明確だと思います。それは時間を通して循環します。比較する時間が最初の 1 時間の場合は、60 - 分を使用します。最後の場合は、議事録を使用します。それ以外の場合は、60 を使用してください。