我正在用PHP和MySQL構建一個簡單的可用性日曆。MySQL可用性日曆 - 計算免費日期的方法?
我已存儲的可用日期爲屬性表(目前個個都是7天塊)
available_dates:
start_date DATE
end_date DATE
available_id INT PRIMARY KEY
property_id INT
booked TINYINT(1)
並預訂日期的表,它引用了我的available_dates
表available_id
:
bookings
booking_id INT
available_id INT
***user details***
我打算爲每個屬性添加行,以標記哪些日期可以預訂,然後在有人預訂時設置預訂標誌。
我想要做的是顯示沒有可用性設置的日期列表(在x
天內,在這種情況下爲7塊),因此日期不會顯示在該表中 - 在接下來的24個月或者。
我有麻煩纏繞在此我的頭,我知道還有一個更簡單的方式來做到這一點,我通過每個屬性,然後每7天循環塊,等等等等
的第一想法任何人都可以啓發我嗎?
更新:
由於@ZaneBien的輝煌和全面的答覆,我設法用他yeardate
表&程序得到我需要的結果。 我所做的是當需要顯示沒有可用性設置的日期的頁面被請求時,如果CURYEAR()+2
沒有任何值,PHP會調用該過程來添加更多的yeardates。
然後讓我的結果,贊恩的查詢稍加修改的版本:
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
子句查詢這樣我就可以在每星期六的星期六到星期六的每個星期六之間得到不同的結果。
所以不是:
+------------+------------+
| 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提供了一個很好的答案。
因此,在用戶預訂日期塊(將新記錄插入到預訂表中)後,您是否立即將該日期的預訂標誌設置爲1?另外,如果用戶預定3周,你會怎麼做?他們可以嗎?您是否在預訂表中插入3行來預訂3個區塊中的每一個? –
最初在閱讀你的問題之後,我以爲你只是想要所有'available_dates'中沒有預訂的記錄(WHERE預訂= 0或NOT IN等),但仔細閱讀後,我會想*你想要什麼在接下來的兩個**年中**都是7天的**,**在'availability_dates'表中不是**。它是否正確? –
@ZaneBien是的,他們可以預訂> 1日期,預訂的每個區塊將在預訂表中排成一行。是的,我知道這不是最清晰的問題,這個問題相當複雜(至少對我來說),但你得到它的要點:) – jammypeach