1

このクエリは、特定の日に占有されている部屋 #077 のリストを返します。このクエリを逆にして、データベースにない 07:00:00 から 22:00:00 までの時間だけを表示するにはどうすればよいですか? (30分間隔)、各クラスは1時間30分しかかかりません

select 
    *
from
    (select 
        rooms.id, rooms.number, rooms.building, rooms.capacity
    from
        rooms) R1,
    (select 
        exam_schedules.room_id,
            exam_schedules.day,
            exam_schedules.start_time,
            exam_schedules.end_time
    from
        exam_schedules) R2
where
    R2.room_id = R1.id and R2.day = 'tuesday' and R1.number = '077'

結果は次のとおりです。

ID  number  Bulding Capacity    room_id day start_time  end_time
1   077 ACT 12  1   tuesday 10:30:00    12:00:00

しかし、以下に示す結果が必要です (これは、試験で占有されておらず、スケジュールの問題が発生する可能性があるため、他の試験で占有できない可能性のある利用可能な時間を示しています: たとえば、試験がすでに 10.30 にスケジュールされている場合、 9.00 (9.30 ではない) を表示する必要があります。9.30 が表示されている場合は競合が発生します: 9.30+1.30 = 11.00 - しかし、この部屋には既に 10.30-12.00 がスケジュールされています)

 1  077 ACT 12  1   tuesday 07:00:00
 1  077 ACT 12  1   tuesday 07:30:00
 1  077 ACT 12  1   tuesday 08:00:00
 1  077 ACT 12  1   tuesday 08:30:00
 1  077 ACT 12  1   tuesday 09:00:00
//note that time frame from 9.30-10.30 is not available since there is a class at 10.30 scheduled already
//note that time period 10.30-<12.00 not shown since class is already scheduled for this timeframe 10.30-12.00
 1  077 ACT 12  1   tuesday 12:00:00
 1  077 ACT 12  1   tuesday 12:30:00
 1  077 ACT 12  1   tuesday 13:00:00
 1  077 ACT 12  1   tuesday 13:30:00
 1  077 ACT 12  1   tuesday 14:00:00
 1  077 ACT 12  1   tuesday 14:30:00
 1  077 ACT 12  1   tuesday 15:00:00
 1  077 ACT 12  1   tuesday 15:30:00
 1  077 ACT 12  1   tuesday 16:00:00
 1  077 ACT 12  1   tuesday 16:30:00
 1  077 ACT 12  1   tuesday 17:00:00
 1  077 ACT 12  1   tuesday 17:30:00
 1  077 ACT 12  1   tuesday 18:00:00
 1  077 ACT 12  1   tuesday 18:30:00
 1  077 ACT 12  1   tuesday 19:00:00
 1  077 ACT 12  1   tuesday 19:30:00
 1  077 ACT 12  1   tuesday 20:00:00
 1  077 ACT 12  1   tuesday 20:30:00
 1  077 ACT 12  1   tuesday 21:00:00
 1  077 ACT 12  1   tuesday 21:30:00
 1  077 ACT 12  1   tuesday 22:00:00

可能なすべての時間枠を含むテーブルがデータベースに存在しません。クエリにコーディングすることはできますか?

4

3 に答える 3

0

すべての可能な値のリストを作成する必要があります。select * from (select '2012-01-01 7:00:00' from dual union all select '2012-01-01 7:30:00' from dual union all . . . ) 回

つまり、union all を使用してデータをまとめることができます。これを機能させるために必要な SQL ステートメントをまとめるには、Excel を使用するのが最も簡単だと思います。

そうは言っても、カレンダー/カレンダータイムテーブルは考慮すべきものです. 考えられる各タイムスロットを表にまとめておくと、将来的に役立つでしょう。

于 2012-04-23T01:54:08.283 に答える
0

たとえば、次のクエリを使用します。

SELECT * FROM Persons WHERE Year='1965'

この SQL クエリは、すべての 'Year' フィールドが '1965' に等しい 'Persons' テーブルのすべての行を含むデータ セットを返します。あなたが言ったように、SQLクエリを逆にして、反対のデータセットを返したいと思っていました。これは WHERE 句で可能になり、不等号演算子を使用できます: SQL の一部のバージョンでは <> または !=

SELECT * FROM Persons WHERE Year<>'1965' 

また

SELECT * FROM Persons WHERE Year!='1965'

フィールドが「1965」と等しくない「Persons」テーブルの行を含むデータセットを返します。

これがあなたのSQLクエリに役立つことを願っています。データベースから反対のデータセットを返す必要がある場所に <> または != 演算子を実装するだけで済みます。これは、現在のクエリで既に返されているデータから反対のデータが必要であると想定しています。

これがあなたが望んでいたものではない場合は、質問を更新して、どのような出力が期待されるかを明確に説明してください - 例 - クエリを実行して目的の結果を取得できるようにします。

于 2012-04-21T04:38:22.230 に答える
0

私が最初に答えだ
と思うものを教えてください。あなたが探しているのはBetween ... And.... というかNot(Between .. And..)Between ... And...範囲演算子です。そう x Between 1 And 10 = 1<x<10そしてNot x Between 1 And 10 = x<1 || x>10
私にとって明らかに間違っているクエリの特定の部分があります select *。次のようにテーブルに結合できます。

select 
    rooms.id, rooms.number, rooms.building, rooms.capacity,exam_schedules.room_id,
        exam_schedules.day,
        exam_schedules.start_time,
        exam_schedules.end_time
from
    rooms,exam_schedules
where
    exam_schedules.room_id = rooms.id and exam_schedules.day = 'tuesday' and rooms.number = '077'
于 2012-04-21T04:44:45.043 に答える