3

構築しなければならない予約システム (PHP/Mysql) で日数を検証するのに問題があります。以前も同様の質問を投稿しました予約制の日程ですが、何かが変わりました。

私が抱えている問題; オフィス内にスタジオ・会議室をご用意しております。期間限定で貸し出し中です。ユーザーは、部屋を借りたい日、時間、時間を選択します。

予約手順:

1- ユーザーはスタジオを借りたい月を選択します。2- ユーザーはスタジオを借りたい日を選択します。(ここで行き詰まります) 3- ユーザーはキーを取得したい時間を選択します。

キーの受信可能時間:

00:00:00 - 06:00:00
06:00:00 - 12:00:00
12:00:00 - 18:00:00
18:00:00 - 24:00:00

これらの時間は、ユーザーがドアの鍵を受け取る時間です。

4- ユーザーは、スタジオを借りたい時間を選択します。

問題: スタジオのレンタル日は確認できますが、正確な時間は確認できません。PHPで時間をチェックする方法を知っています。しかし、例えば;

ユーザー 1 は、2012 年 4 月 27 日の 12:00:00 から 18 時間後までスタジオを借ります。ユーザー 2 は、2012 年 4 月 26 日の 18:00:00 から 12 時間後までスタジオを借りたいと考えています。ユーザー 3 は、4 月 28 日にスタジオを借りたいと考えています。

ユーザー 2 が最大 4 月 27 日 12:00:00 までスタジオをレンタルできるかどうかを確認するにはどうすればよいでしょうか。また、ユーザー 3 が 28 日にスタジオをレンタルできるかどうかを確認し、06:00 以降に利用できることを確認するにはどうすればよいでしょうか。

データベース:

id                 int(11)
user_id             int(11)
rental_name         varchar(255)
key_receive_time varchar(255)
start_date         int(11)
end_date         int(11)
total_hours      int(11)

私はこれを2日連続で行っていますが、まだクラックできません。解決策は簡単だと思いますが、おそらく間違った方向に検索します。

前もって感謝します。

クエリの例を編集します。

SELECT * FROM reservations
WHERE (start_date >= " . $start_block_1 . " AND end_date <= " . $end_block_1   . ")
OR    (start_date >= " . $end_block_1   . " AND end_date <= " . $start_block_1 . ")

$start_block_1とは、1 日の$end_block_1タイムスタンプ 00:00:00 ~ 06:00:00ブロックを表します。

ユーザーがキーを受け取ることができるブロックが 1 日に 4 つあるため、このクエリを 4 回実行します。

4

1 に答える 1

2

間隔 (開始日と終了日のペア) がデータベース内の既存の間隔と競合するかどうかを確認する必要があるようです。これが必要な場合は、クエリを次に示します。

-- //// FOR TESTING \\\\
CREATE TABLE reservations (start_date INT, end_date INT);

INSERT INTO reservations(
    start_date,
    end_date
)
VALUES (
    UNIX_TIMESTAMP('2012-04-27 12:00:00'), -- start date booked by user 1
    UNIX_TIMESTAMP('2012-04-28 06:00:00')  -- end date booked by user 1
);

SET @d1 = UNIX_TIMESTAMP('2012-04-26 18:00:00'); -- start date requested by user 2
SET @d2 = UNIX_TIMESTAMP('2012-04-27 06:00:00'); -- end date requested by user 2
-- \\\\ FOR TESTING ////

SELECT 1
FROM reservations
WHERE
(@d1        <= start_date AND start_date <  @d2     ) OR -- start datetime lies "inside" the interval
(@d1        <  end_date   AND end_date   <= @d2     ) OR -- end datetime lies "inside" the interval
(start_date <= @d1        AND @d2        <= end_date)    -- the interval itself lies inside start and end datetime

クエリは、指定された間隔と競合する行を返します。変数@d1@d2は、mysql クライアントでクエリをテストするためのものです。それらを PHP コードから渡されたデータに置き換えます。

注: 比較演算子<<=は、開始/終了日時が包括的か排他的かによって変更する必要がある場合があります。

于 2012-04-26T08:59:44.813 に答える