我有一个 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:00
到2014-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/