0

編集: ゴードンが投稿したクエリには問題があるようです。10 ~ 12 日の予約がある場合、午後 12 時以降のすべての予約は無効と見なされるようですが、午前 10 時より前のすべての予約は有効です。

すばやく簡単に考えた結果、次のクエリを作成することになりました。

SELECT serverip 
        FROM   server 
        WHERE  serverip NOT IN (SELECT serverip 
                                FROM   booking 
                                WHERE  startat >= datehere 
                                AND expiresat <= datehere) 
        LIMIT  1; 

予約テーブルに次のものが格納されているとします。

+-----------+-----------+----------+----------+-----------+
| bookingid | serverip  | username | startat  | expiresat |
+-----------+-----------+----------+----------+-----------+
|         1 | 127.0.0.1 | testuser | 10:00    | 12:00     |
+-----------+-----------+----------+----------+-----------+

ユーザーが予約のために次のデータを入力した場合:

startat = 9:59
expiresat = 12:01

彼らは私のチェックを簡単にバイパスして、保存された以前の予約に基づいて予約時間が利用可能かどうかを確認できます.

この問題をよりよく解決する方法について何かアドバイスはありますか?

ユーザーの入力を制限したくないし、特定のタイムスロットをハードコーディングすることは避けたいと思いますが、それが問題でなければ、私は自分が持っているものに固執します.

御時間ありがとうございます。

4

3 に答える 3

5

オーバーラップのロジックを変更する必要があります。これを試して:

SELECT serverip 
FROM  server 
WHERE serverip NOT IN (SELECT serverip 
                       FROM booking 
                       WHERE startat <= USEREXPIREDATE AND
                             expiresat >= USERSTARTDATE
                      ) 
LIMIT  1; 

スロットは、目的のユーザーの有効期限が切れる前に開始し、目的のユーザーの開始日が過ぎると終了すると占有されます。

于 2013-01-29T15:53:23.690 に答える
1
SELECT *
FROM server
WHERE serverip NOT IN
(SELECT serverip 
 FROM booking
 WHERE
   (startat <= '2013-01-30 08:00:00' AND expiresat >= '2013-01-30 08:00:00') OR
   (startat <= '2013-01-30 09:00:00' AND expiresat >= '2013-01-30 09:00:00') OR
   (startat >= '2013-01-30 08:00:00' AND expiresat <= '2013-01-30 09:00:00'))

8:00 が開始時刻で、9:00 が終了時刻です。

于 2013-01-29T18:28:08.153 に答える