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

标签 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,应用程序会告诉用户给定范围内已经有促销价。

最佳答案

判断两个线段 [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 时,日期范围要么包含在另一个中(一起开始或一起结束),要么其中一个正好在另一个结束时开始。

关于php - 在 MySQL 中查找给定的日期范围是否在另一个日期范围内,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27430253/

相关文章:

php - MySQL日期格式排序错误

php mysql 分页和两个日期之间的搜索

javascript - 让 Magento 类别返回 false

mysql。如果一个数据库中有太多关系,这是否正常?

mysql - laravel 5 与 json 的自关系

mysql - 字段为 0 的子顺序

php - 如何从 MySQL 表创建 PHP 数组

php - 使用 jquery 保持旧状态

php - 如何在 header php 中使用 api token

javascript - 在 mongoDB Node.js 中搜索日期并忽略时间和日期