1

jquerymobileを使用してモバイルWebアプリを構築しています。まず、私がしていることをスケッチしましょう。

ユーザーが会議室を予約したい。最初に彼は部屋を選び、予約したい部屋だけを選びます。他の部屋は選びません。彼はまた、開始と終了のDATETIMEを入力します。これは彼がこの部屋を持ちたい期間です。

これで、Webサービスに、その特定の会議室で行われたすべての予約のリストを返す機能があります。後で、このリストが空かどうかをJavaScriptでチェックインします。

今私のデータベース構造。

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

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

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

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

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

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

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

SELECT res.DATE_BEGIN,res.DATE_END 
FROM reservations res
INNER JOIN room roo
ON res.ROOMID =roo.ID
WHERE WHERE res.DATE_BEGIN <> @DATE_BEGIN
AND res_DATE_END <> @DATE_END

さて、私の質問は、正しい結果を得るためにどのようなクエリをすべきかということです。また、過去の予約は除外する必要があります。

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

ありがとうございました

4

2 に答える 2

4

ある日付範囲が別の日付範囲と重複しているかどうかを確認する必要があります。

New Date Range =               |-----------|
Test1          =      |=====|
Test2          =            |=====|
Test3          =                  |=====|
Test4          =                        |=====|
Test5          =                              |=====|
Test6          =            |=================|

Test1 と Test5 のみが重複していません。

したがって、衝突は次の方法で見つけることができます...

SELECT
  res.DATE_BEGIN, res.DATE_END
FROM
  reservations res
INNER JOIN
  room roo
    ON res.ROOMID =roo.ID
WHERE
      res.DATE_BEGIN < @DATE_END
  AND res_DATE_END   > @DATE_BEGIN


ノート:

境界条件に注意してください。ある会議が午前 10 時に終了し、別の会議が午前 10 時に開始する場合、通常、これは重複とは見なされません。<とを使用するのはそのため>です。


編集

この質問と回答の範囲外の理由により、上記で強調したようなクエリは、インデックスを使用して簡単に最適化することはできません。

このため、別の方法として、部屋を予約できる時間帯を作成する方法があります。正午を 2 分 33 秒過ぎた時点で会議を開始する必要はありません。代わりに、12:00 に開始します。そのため、通常は 5 分のブロックで十分に正確であり、実際、システムでは 15 分ブロックまたは 30 分ブロックを使用することがよくあります。

これは、1 つの予約で複数のレコード (予約された時間のブロックごとに 1 つのレコード) を取得できることを意味しますが、そのデータに対するすべてのクエリの解決がより簡単になります。

于 2012-05-25T09:03:19.867 に答える
0

受け入れられた回答は、重複する会議を処理しますが、既存の会議と同時に会議に対処しません。承認された解決策のクエリを使用し、同じ開始日と終了日の 2 つ目のチェックを追加しました。読みやすくするために、クエリを別々にしました。

上記のソリューションを使用して、この 2 番目のチェックを追加しました。

-- 新しい会議は、既存の会議と同時に開始または終了しますか?
SELECT res.DATE_BEGIN, res.DATE_END
FROM 予約 res
WHERE res.DATE_BEGIN = @DATE_BEGIN OR
res.DATE_END = @DATE_END;

結果は、競合があることを示します。

于 2013-12-03T15:14:14.760 に答える