Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/66.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 在日期期限内匹配条目_Mysql - Fatal编程技术网

Mysql 在日期期限内匹配条目

Mysql 在日期期限内匹配条目,mysql,Mysql,我有一个预订系统;每个包含条目的预订[到达日期:2011年1月14日00:30;出发日期:2011年1月16日00:30];我想显示数据库中在此预订期间出现的所有预订 好吧,我有这些预订:[见下文]前两个已经在数据库中;现在第三个是新条目;第一次和第二次都在第三次预订出现的时间 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以获取该信息?使用SQL:

我有一个预订系统;每个包含条目的预订[到达日期:2011年1月14日00:30;出发日期:2011年1月16日00:30];我想显示数据库中在此预订期间出现的所有预订

好吧,我有这些预订:[见下文]前两个已经在数据库中;现在第三个是新条目;第一次和第二次都在第三次预订出现的时间

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以获取该信息?

使用SQL:


从到达和离开日期之间的预订中选择*,所以您需要预订A和预订B之间的所有预订,对吗

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;
假设您已经知道标记终点的两个预订是否安全?如果是这样,这很简单,但可能并不明显

情景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')";

在上述所有情况下,将查询从和切换到或将生成两个事件中的事件,但不受两个事件的约束,仅限于其中一个事件。

我们需要先了解一下数据库体系结构。是否为预订分配了唯一ID?日期存储在哪里?每次预订?单独?假设预订表简单到:id |到达|日期|离开|日期。