我有预订系统;每个包含条目的预订[到货日期:2011年1月14日00:30;出发日期:2011年1月16日00:30];我想显示在预订期间出现的数据库中的所有预订。
好吧,我有这些预订:[见下文]前两个已经在数据库中;现在第三个是新的条目;第1和第2都在第3次预订时出现。a: 2010 01 03
d: 2010 01 10
a: 2009 09 10
d: 2010 02 10
a: 2010 01 02
d: 2010 01 05
如何查询MySQL以获得它?
答案 0 :(得分:0)
使用SQL:
SELECT * FROM预订到期和离开的日期
答案 1 :(得分:0)
SELECT * FROM hp_reservations WHERE ((`arrival_date` BETWEEN i:arrival_date AND i:departure_date) OR (`departure_date` BETWEEN i:arrival_date AND i:departure_date)) AND `id` != i:id;
答案 2 :(得分:0)
所以你想要预订A和预订B之间的所有预订,对吧?
假设您已经知道标记终点的两个预订是否安全?如果是这样,这很简单(尽管I had to ask awhile back),但可能并不明显。
场景1 - 已知日期:
$booking_a_arr = 2010-01-03;
$booking_a_dep = 2010-01-10;
$booking_b_arr = 2009-09-10;
$booking_b_dep = 2010-02-10;
$query = "SELECT id, arrival, departure FROM BOOKINGS
WHERE
arrival >= '$booking_a_arr' AND
departure <= $booking_b_dep";
场景2 - 已知ID:
只有预订ID,这需要每个预订的子查询来获取日期:
$booking_a_id = "A";
$booking_b_id = "B";
$query = "SELECT id, arrival, departure FROM BOOKINGS
WHERE
arrival >= (SELECT arrival FROM BOOKINGS WHERE id = '$booking_a_id')
AND departure <= (SELECT departure FROM BOOKINGS WHERE id = '$booking_b_id')";
通过将到达设置为大于较早的预订日期并且出发时间小于稍后的预订日期,您基本上将结果限制在介于两者之间但仍包含外部预订的结果。如果您想要一个不重叠但在这两个事件之间的所有预订的列表,您可以将边界设置为两个事件的内边缘而不是它们的外边缘,如下所示:
$booking_a_id = "A";
$booking_b_id = "B";
$query = "SELECT id, arrival, departure FROM BOOKINGS
WHERE
arrival >= (SELECT departure FROM BOOKINGS WHERE id = '$booking_a_id')
AND departure <= (SELECT arrival FROM BOOKINGS WHERE id = '$booking_b_id')";
在最后一种情况下,如果两个原始预订本身重叠,则会返回在重叠内部计划的所有事件。但是如果是这种情况,并且你想要重叠,不只是在重叠内开始和结束,你会使用:
$query = "SELECT id, arrival, departure FROM BOOKINGS
WHERE
arrival >= (SELECT departure FROM BOOKINGS WHERE id = '$booking_a_id')
OR departure <= (SELECT arrival FROM BOOKINGS WHERE id = '$booking_b_id')";
在上述所有情况下,将查询从AND
切换到OR
将为您提供属于两个事件但不受两个事件约束的事件,只有一个或另一个。< / p>