我正在用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