PHPとMySQLを使用してシンプルな可用性カレンダーを作成しています。
プロパティの利用可能な日付を格納するテーブルがあります(現在、それらはすべて7日間のブロックです)
available_dates:
start_date DATE
end_date DATE
available_id INT PRIMARY KEY
property_id INT
booked TINYINT(1)
available_id
そして、私のテーブルのを参照する予約された日付のavailable_dates
テーブル:
bookings
booking_id INT
available_id INT
***user details***
各プロパティのavailable_datesに行を追加して、予約できる日付をマークし、誰かがそのブロックを予約したときに、そのテーブルに予約済みフラグを設定する予定です。
私がやりたいのはx
、可用性が設定されていない日付のリスト(日単位、この場合は7)を表示することです。そのため、日付はそのテーブルに表示されません。今後24か月ほどです。
私はこれに頭を悩ませるのに苦労しています。最初に各プロパティをループし、次に7日間の各ブロックなどをループするという、より簡単な方法があることを知っています。
誰かが私を啓発できますか?
アップデート:
@ZaneBienの素晴らしく包括的な回答のおかげで、彼のyeardate
テーブルと手順を使用して、必要な結果を得ることができました。私が行ったことは、可用性が設定されていない日付を表示する必要があるページが要求されたときに、PHPがプロシージャを呼び出して、の日付がない場合はさらに年の日付を追加しますCURYEAR()+2
。
次に、私の結果を取得するために、Zaneのクエリのわずかに変更されたバージョン:
SELECT
a.yeardate AS blockstart,
DATE_ADD(a.yeardate, INTERVAL 7 DAY) AS blockend
FROM
yeardates a
LEFT JOIN
available_dates b
ON(a.yeardate BETWEEN b.start_date AND b.end_date)
OR
(DATE_ADD(a.yeardate, INTERVAL 7 DAY) BETWEEN b.start_date AND b.end_date)
WHERE
b.date_id IS NULL AND WEEKDAY(a.yeardate)=5;
私の場合、ブロックは土曜日から土曜日までの7日間です。そのWHERE
ため、クエリに2番目の句を追加して、行ごとに1週間の土曜日から土曜日のブロックを次々に取得できるようにしました。
したがって、代わりに:
+------------+------------+
| blockstart | blockend |
+------------+------------+
| 2012-01-01 | 2012-01-08 |
| 2012-01-02 | 2012-01-09 |
| 2012-01-03 | 2012-01-10 |
| 2012-01-04 | 2012-01-11 |
私はこれを手に入れます:
+------------+------------+
| blockstart | blockend |
+------------+------------+
| 2012-01-07 | 2012-01-14 |
| 2012-01-14 | 2012-01-21 |
| 2012-01-21 | 2012-01-28 |
| 2012-01-28 | 2012-02-04 |
それはまさに私が必要としているものです。素晴らしい答えをくれたZaneにもう一度感謝します。