查找MySQL中另一个日期范围内的给定日期范围

时间:2014-12-11 18:50:59

标签: php mysql date

我有一个price_table,有两列:start_date和end_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' AND '2014-12-13 11:45:00')

问题是:

2014-12-10 15:30:002014-12-13 14:30:00的促销价格,因此两条BETWEEN指令都没有捕获它,即使给定范围实际上在数据库范围内。

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

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

2 个答案:

答案 0 :(得分:3)

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

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';

答案 1 :(得分:2)

确定两个段[a,b]和[c,d]是否相互交叉的简单条件是(a-d)*(b-c) <= 0。它涵盖了所有情况,当一个日期范围(段)仅开始或仅在另一个日期范围(段)结束时以及当其中一个完全包含在另一个日期范围内时。

为了在MySQL中使用日期实现这一点,你需要将它们转换为数字(Unix时间戳):

SELECT *
FROM tbl_preco
WHERE isActive = 1
   AND (UNIX_TIMESTAMP(start_date) - UNIX_TIMESTAMP('2014-12-11 15:45:00'))
     * (UNIX_TIMESTAMP(end_date) - UNIX_TIMESTAMP('2014-12-13 11:45:00')) <= 0
;

当产品为0时,日期范围要么包含在另一个中(一起开始或一起结束),要么其中一个在另一个结束时正好开始。