2016-10-14 7 views
0

他のテーブルにすでに予約されているタイムスロットを持つ、スケジューリングカレンダーテーブルからすべての利用可能なタイムスロットを出力するビューを作成しようとしています。スケジュールされた時間枠から利用可能なタイムスロットを抽出する

テーブルを考える:

Table Calendar 

ID Date   StartTime EndTime 
56 18-OCT-16 10.00.00  18.00.00 
62 21-OCT-16 11.00.00  20.30.00 
72 27-OCT-16 09.30.00  17.00.00 
72 28-OCT-16 08.40.00  18.00.00 

Table ScheduledTimes 

ID Date   StartTime EndTime 
62 21-OCT-16 13.00.00  14.30.00 
62 21-OCT-16 16.00.00  17.00.00 
62 21-OCT-16 17.20.00  18.00.00 
72 27-OCT-16 09.30.00  10.00.00 
72 27-OCT-16 10.00.00  11.00.00 
72 28-OCT-16 09.41.00  11.00.00 
72 28-OCT-16 12.40.00  18.00.00 

私はこれを達成するための方法を探しています:

ID Date   StartTime EndTime 
56 18-OCT-16 10.00.00  18.00.00 
62 21-OCT-16 11.00.00  13.00.00 
62 21-OCT-16 14.30.00  16.00.00 
62 21-OCT-16 17.00.00  17.20.00 
62 21-OCT-16 18.00.00  20.30.00 
72 27-OCT-16 11.00.00  17.00.00 
72 28-OCT-16 08.40.00  09.41.00 
72 28-OCT-16 11.00.00  12.40.00 

ScheduledTimesでの値が全て確認され、時間枠の内側になるようにしてくださいカレンダーの時間とお互いに矛盾しない。

+0

何ですか日付、のStartTimeと終了時間のデータ型?それらはすべて文字列として格納されていますか?また、私はIDの意味があると思います(部屋番号、会場など)? – mathguy

答えて

2

と仮定すると、あなたの入力列は、すべての文字列です:

with 
    calendar (id, dt, starttime, endtime) as (
     select 56, '18-OCT-16', '10.00.00', '18.00.00' from dual union all 
     select 62, '21-OCT-16', '11.00.00', '20.30.00' from dual union all 
     select 72, '27-OCT-16', '09.30.00', '17.00.00' from dual union all 
     select 72, '28-OCT-16', '08.40.00', '18.00.00' from dual 
    ), 
    scheduledtimes (id, dt, starttime, endtime) as (
     select 62, '21-OCT-16', '13.00.00', '14.30.00' from dual union all 
     select 62, '21-OCT-16', '16.00.00', '17.00.00' from dual union all 
     select 62, '21-OCT-16', '17.20.00', '18.00.00' from dual union all 
     select 72, '27-OCT-16', '09.30.00', '10.00.00' from dual union all 
     select 72, '27-OCT-16', '10.00.00', '11.00.00' from dual union all 
     select 72, '28-OCT-16', '09.41.00', '11.00.00' from dual union all 
     select 72, '28-OCT-16', '12.40.00', '18.00.00' from dual 
    ), 
    u (id, dt, startdatetime, enddatetime) as (
     select id, dt, to_date(dt || starttime, 'dd-MON-yyhh24.mi.ss'), 
         to_date(dt || endtime , 'dd-MON-yyhh24.mi.ss') 
     from scheduledtimes 
     union all 
     select id, dt, null, to_date(dt || starttime, 'dd-MON-yyhh24.mi.ss') 
     from calendar 
     union all 
     select id, dt, to_date(dt || endtime, 'dd-MON-yyhh24.mi.ss'), null 
     from calendar 
    ), 
    prep (id, dt, starttime, endtime) as (
     select id, dt, to_char(enddatetime, 'hh24:mi:ss') as starttime, 
       to_char(lead(startdatetime) over (partition by id, dt 
          order by enddatetime), 'hh24:mi:ss') as endtime 
     from u 
    ) 
select id, dt, starttime, endtime 
from prep 
where starttime < endtime 
order by id, dt, endtime; 
関連する問題