-1

PHP / MySQL SELECT

会議室の特定の日の利用可能な時間のテーブルがあります。Temp_Resは、予約が進行中のときにタイムスタンプを取得します(これらの行をロックするため)。予約する会議が2時間の場合、可能な限りの時間枠を取得したいと思います。

日時間Temp_Res228
0000-00-00 00:00:00
22 9 0000-00-00 00:00:00
22 10 0000-00-00 00:00:00
22 11 2012-05-18 22:02: 00
22 12 2012-05-18 22:02:00
22 13 2012-05-18 22:02:00
22 14 0000-00-00 00:00:00
22 15 0000-00-00 00:00:00
22 16 0000-00-00 00:00:00
22 17 0000-00-00 00:00:00

したがって、必要な時間が2時間の場合、8、9、14、15、16時間のみが出力されます。(次に、時間を使用し、2を追加してスロットを取得します:8-10、9-11、14-16、15-17、および16-18)
タイムスロットが3時間の場合、時間8、14、15のみが出力とスロットになります:8-11、14-17、15-18 .... etc
SELECTでこれを実行できるようにするには(可能な場合)、テーブル内の他の行を確認する方法が必要です。特定の行を含めるかどうかを決定します。

1.他の行を調べて、WHERE(または同様の)を使用したSELECTでこれを行うことは可能ですか?

2.可能であれば、私を正しい方向に導いていただけませんか。

3.他の解決策/アイデア(以下のものを除く)も非常に高く評価されています!

それ以外の場合は、次の方法で解決する必要があります。a)
追加のタイムスロットテーブルを作成する
b)その特定の行の最大タイムスロットを示す追加の列を作成する。以下を参照してください。

日時間スロットTemp_Res228
3 0000-00-00 00:00:00
22 9 2 0000-00-00 00:00:00
22 10 1 0000-00-00 00:00:00
22 11 0 2012-05- 18 22:02:00
22 12 0 2012-05-18 22:02:00
22 13 0 2012-05-18 22:02:00
22 14 4 0000-00-00 00:00:00
22 15 3 0000- 00-00 00:00:00
22 16 2 0000-00-00 00:00:00
22 17 1 0000-00-00 00:00:00

SELECT Day、Hour FROM table
WHERE Slot> = 2 AND Temp_Res <"2012-05-18 22:00:00"
GROUP BY Day、Hour

4

1 に答える 1

0

開始時間と会議の長さを使用して終了時間を計算することをお勧めします。これは、「この予約を行うために空いている必要がある最後の1時間」に相当します。次に、内部結合を使用して、終了時刻までの1時間ごとに予約が解除される開始時刻のみを選択できます。4時間の会議の場合、クエリは次のようになります。

SELECT start.day, start.hour from table as start 
INNER JOIN table as hour1
    ON ((hour1.hour = start.hour + 1) AND (hour1.TempRes = '0000-00-00 00:00:00'))
INNER JOIN table as hour2
    ON ((hour2.hour = start.hour + 2) AND (hour2.TempRes = '0000-00-00 00:00:00'))
INNER JOIN table as hour3
    ON ((hour2.hour = start.hour + 3) AND (hour3.TempRes = '0000-00-00 00:00:00'))
WHERE table.TempRes = '0000-00-00 00:00:00'

PHPのループを使用して、必要な数の内部結合句をクエリテキストに追加できます(自分で計算した変数を使用しているため、インジェクションについて心配する必要はありません)。常にそうなります(会議の期間-1)。

誰かが深夜を通過する会議をスケジュールしようとした場合、これは営業時間を返しませんが、それが望ましくない場合は、日変数を適切にインクリメントするロジックを簡単に作成できます。

于 2012-05-19T22:20:49.077 に答える