Php 在MySQL中查找给定日期范围是否在另一个日期范围内

Php 在MySQL中查找给定日期范围是否在另一个日期范围内,php,mysql,date,Php,Mysql,Date,我有一个价格表,它有两列:开始日期和结束日期(用于促销价格) 我正在尝试创建一个查询,该查询将检查给定的日期范围是否不属于另一个已经存在的日期范围 我一直在尝试使用此查询: SELECT * FROM tbl_preco WHERE isActive = 1 AND (start_date between '2014-12-11 15:45:00' AND '2014-12-13 11:45:00' OR end_date between '2014-12-11 15:45:00

我有一个价格表,它有两列:开始日期和结束日期(用于促销价格)

我正在尝试创建一个查询,该查询将检查给定的日期范围是否不属于另一个已经存在的日期范围

我一直在尝试使用此查询:

SELECT *
FROM tbl_preco
WHERE isActive = 1 AND (start_date between '2014-12-11 15:45:00' AND '2014-12-13 11:45:00'
        OR end_date between '2014-12-11 15:45:00' AND '2014-12-13 11:45:00')
问题是:

促销价格从
2014-12-10 15:30:00
2014-12-13 14:30:00
,因此两条指令之间都没有捕捉到它,即使给定的范围实际上在DB的范围内

                   |------GIVEN RANGE-------|
       |-------- RANGE IN DB --------|

上面的示例应返回为TRUE,应用程序将告诉用户在给定范围内已经有促销价格。

听起来您希望在该范围内进行任何促销活动。在这种情况下,您不需要检查开始日期和结束日期是否存在于范围内,这就是您现在正在做的。您只需检查开始日期是否发生在范围关闭之前,然后检查结束日期是否发生在范围打开之后。希望这有意义

SELECT *
FROM tbl_preco
WHERE isActive = 1 
AND start_date < '2014-12-13 11:45:00' 
AND end_date > '2014-12-11 15:45:00';
选择*
来自tbl_preco
其中isActive=1
开始日期<'2014-12-13 11:45:00'
结束日期>'2014-12-11 15:45:00';

听起来您希望在该范围内进行任何促销活动。在这种情况下,您不需要检查开始日期和结束日期是否存在于范围内,这就是您现在正在做的。您只需检查开始日期是否发生在范围关闭之前,然后检查结束日期是否发生在范围打开之后。希望这有意义

SELECT *
FROM tbl_preco
WHERE isActive = 1 
AND start_date < '2014-12-13 11:45:00' 
AND end_date > '2014-12-11 15:45:00';
选择*
来自tbl_preco
其中isActive=1
开始日期<'2014-12-13 11:45:00'
结束日期>'2014-12-11 15:45:00';

确定两段[A,b]和[c,d]是否相交的一个简单条件是
(A-d)*(b-c)确定两段[A,b]和[c,d]是否相交的一个简单条件是
(A-d)*(b-c)但2014-12-10 15:30:00不在“2014-12-11 15:45:00”和“2014-12-13 11:45:00”之间,2014-12-13 14:30:00不在“2014-12-11 15:45:00”和“2014-12-13 11:45:00”之间,所以永远不会返回值,我看不出有任何问题that@BredeBasualdoSerraino当然,这正是我所说的。问题是两个范围都会发生冲突。即使开始日期和结束日期不在给定值之间,但范围同时发生,这不应该发生。我认为您还需要检测其中一个日期范围何时完全包含在另一个日期范围中。如果编辑更清楚,请按照@Chuck下面所说的做,我认为这是最好的答案,但2014-12-10 15:30:00不是在“2014-12-11 15:45:00”和“2014-12-13 11:45:00”之间,2014-12-13 14:30:00不是在“2014-12-11 15:45:00”和“2014-12-13 11:45:00”之间,所以永远不会返回值,我认为没有问题that@BredeBasualdoSerraino当然,这正是我所说的。问题是两个范围都会发生冲突。即使开始日期和结束日期不在给定值之间,但范围同时发生,这不应该发生。我认为您还需要检测其中一个日期范围何时完全包含在另一个日期范围中。如果编辑更清楚,请按照@Chuck下面所说的做,我认为最好的答案是如果日期范围在2014年12月10日至2014年12月14日之间,如果日期范围在2014年12月10日至2014年12月14日之间