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

Lea*_*rio 2 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' AND '2014-12-13 11:45:00')
Run Code Online (Sandbox Code Playgroud)

问题是:

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

                   |------GIVEN RANGE-------|
       |-------- RANGE IN DB --------|
Run Code Online (Sandbox Code Playgroud)

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

axi*_*iac 6

判断两个线段 [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
;
Run Code Online (Sandbox Code Playgroud)

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