我正在使用 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
表格和程序获得了我需要的结果。我所做的是,当请求需要显示没有可用性集的日期的页面时,如果没有 for ,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
在查询中添加了第二个子句,以便我为每一行获得不同的 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 |
这正是我需要的。再次感谢赞恩的精彩回答。