with 範囲テーブル as(
select 1 as No,5 as 方位開始,25 as 方位終了 from dual
union select 2,325, 5 from dual
union select 3, 45,375 from dual),
指定テーブル as(
select trunc(dbms_random.random) as 指定開始,trunc(dbms_random.random) as 指定終了
from all_objects
where RowNum <= 200)
select a.方位開始,a.方位終了,b.指定開始,b.指定終了,
-- 5 355 100 150
case when b.指定開始 <= b.指定終了 and a.方位開始 <= a.方位終了 --場合1
then case when b.指定開始 <= a.方位開始
and a.方位終了 <= b.指定終了 then 1 else 0 end
-- 5 355 325 15
when b.指定開始 <= b.指定終了 and a.方位開始 > a.方位終了 --場合2
then 0
-- 325 15 5 10
when b.指定開始 > b.指定終了 and a.方位開始 <= a.方位終了 --場合3
then case when (a.方位開始 between b.指定開始 and 360
or a.方位開始 between 0 and b.指定終了)
and (a.方位終了 between b.指定開始 and 360
or a.方位終了 between 0 and b.指定終了) then 1 else 0 end
-- 325 15 335 10
when b.指定開始 > b.指定終了 and a.方位開始 > a.方位終了 --場合4
then case when b.指定開始 <= a.方位開始
and a.方位終了 <= b.指定終了 then 1 else 0 end
end as "完全に含むかフラグ変形前",
case when b.指定開始 > b.指定終了 and a.方位開始 <= a.方位終了
and (a.方位開始 between b.指定開始 and 360 or
a.方位開始 between 0 and b.指定終了)
and (a.方位終了 between b.指定開始 and 360 or
a.方位終了 between 0 and b.指定終了)
or (b.指定開始 > b.指定終了 and a.方位開始 > a.方位終了 or
b.指定開始 <= b.指定終了 and a.方位開始 <= a.方位終了)
and b.指定開始 <= a.方位開始
and a.方位終了 <= b.指定終了 then 1 else 0 end as "完全に含むかフラグ変形後",
case when mod(a.方位開始 - b.指定開始 + 360, 360)
<= mod(b.指定終了-b.指定開始+360,360) - mod(a.方位終了-a.方位開始+360,360)
then 1 else 0 end as "ベクトルで考える"
from (select abs(mod(方位開始,360)) as 方位開始,
abs(mod(方位終了,360)) as 方位終了
from 範囲テーブル) a,
(select abs(mod(指定開始,360)) as 指定開始,
abs(mod(指定終了,360)) as 指定終了
from 指定テーブル) b
order by b.指定開始,b.指定終了,a.方位開始;