3

会議室の予約が可能なWebアプリを開発中です。まず、私のデータベースがどのように見えるかを説明しましょう。

Reservations次のデザインのテーブルがあります

  ID           --> int
  ROOMID       --> int
  DATE_BEGIN   --> DATETIME
  DATE_END     --> DATETIME

ROOM次のデザインのテーブルもあります

 ID            --> int
 NAME          --> VARCHAR(30)

これで、テーブルへの行の挿入はreservation次のようになります。

 ID            --> 1
 ROOMID        --> 2
 DATE_BEGIN    --> 2012-01-01 12:02:33
 DATE_END      --> 2012-01-01 14:00:00

今、私がしていることは、開始日と終了日を入力することです。そして、ボタンを押すと、たとえばCheck availability、この特定の日付範囲で使用可能なすべての部屋の名前が返されます。

今のところ私はこのクエリを持っています:

SELECT zaa.NAME 
FROM ARTICLES_ZAAL zaa
INNER JOIN ARTICLES_RESERVERING res
ON zaa.ID =res.ZAALID
WHERE res.DATUM_BEGIN <> @DATUM_BEGIN
AND res_DATUM_EINDE <> @DATUM_EINDE

まだまだ足りないものがたくさんあることは知っていますが、問題は何ですか。私はこれらすべてをWebサービスによって呼び出される関数で実行しています。

誰か助けてもらえますか?

敬具。

4

5 に答える 5

4

他の回答は予約と重複する時間のリクエストを処理しません。また、BETWEENは包括的であるため、適切な選択ではありません(したがって、予約が午後2時に終了し、午後2時に開始する場合は、falseになります。正しくありません)。

このSQLフィドルを試してください。要求された開始日と終了日をいじって、私の仕事をチェックすることができます。これは、私に関する限り、適切に機能しています。

http://sqlfiddle.com/#!3/cb682/25

抜粋:

select * from Room as ro
where ro.ID not in 
            (
              select re.ROOMID
              from Reservations as re 
              where (DATE_BEGIN >= @start and DATE_BEGIN < @end)
                or (DATE_END >= @start and DATE_END < @end)
             )
于 2012-05-09T07:26:09.393 に答える
1

BETWEENを使用してみてください

select * from rooms 
where roomid not in(select roomid from reservation where begin_date between given_begin_date and end_date
于 2012-05-09T09:33:56.273 に答える
0

指定された開始/終了範囲ごとに既存の予約のセットがあり、指定された開始/終了が既存の予約のセットに含まれないという条件をキャプチャする必要があります(を使用してLEFT OUTER JOIN、部屋の場合予約されていない予約日はNULL):

SELECT DISTINCT zaa.NAME  
FROM ARTICLES_ZAAL zaa 
LEFT OUTER JOIN ARTICLES_RESERVERING res 
ON zaa.ID = res.ZAALID 
WHERE ((res.DATUM_BEGIN NOT BETWEEN @DATUM_BEGIN AND @DATUM_EINDE OR (res.DATUM_BEGIN IS NULL))
AND ((res.DATUM_EINDE NOT BETWEEN @DATUM_BEGIN AND @DATUM_EINDE) OR (res.DATUM_EINDE IS NULL))
于 2012-05-09T07:05:41.430 に答える
0

あなたが持っている予約されていない部屋を知るために@DATUM_BEGINそして@DATUM_EINDE。次に、 where >とwhere <の交差をチェックする必要があり@DATUM_BEGINます。res_DATUM_EINDE@DATUM_BEGINres_DATUM_EINDE@DATUM_EINDEres.DATUM_BEGIN@DATUM_EINDEres.DATUM_BEGIN

SELECT zaa.NAME 
FROM ARTICLES_ZAAL zaa
INNER JOIN ARTICLES_RESERVERING res
ON zaa.ID =res.ZAALID
WHERE MAX(res_DATUM_EINDE)<@DATUM_BEGIN
GROUP BY res.ZAALID
INTERSECT
SELECT zaa.NAME 
FROM ARTICLES_ZAAL zaa
INNER JOIN ARTICLES_RESERVERING res
ON zaa.ID =res.ZAALID
WHERE MIN(res.DATUM_BEGIN)>@DATUM_EINDE
GROUP BY res.ZAALID
于 2012-05-09T07:13:34.267 に答える
0
select * from rooms where roomid not in(select roomid from reservation where (begin_date>=given_begin_date and begin_date<=given_end_date ) or(end_date>=given_begin_date and end_date<=given_end_date)) 
于 2012-05-09T07:28:32.057 に答える