MySQL检查两个日期范围是否与输入重叠

8

我需要检查我的数据库中的两个日期是否与另外两个日期重叠。

我的数据库看起来像这样

+----+--------------+------------+------------+
| id | code         | StartDate  | EndDate    |
+----+--------------+------------+------------+
|  1 | KUVX-21-40   | 2013-10-23 | 2013-11-22 |
|  2 | UEXA286-1273 | 2013-10-30 | 2013-11-29 |
|  3 | UAJFAU-2817  | 2013-10-21 | 2013-11-20 |
|  4 | KUVX-21-40   | 2013-10-30 | 2013-11-29 |
+----+--------------+------------+------------+

在我的查询中,我指定了范围:开始日期和结束日期。我们将其分配如下:
ScopeStartDate = "2013-10-1"
ScopeEndDate = "2013-11-26"

上面的查询应该返回所有记录,因为它们都重叠在时间跨度上。
然而,我无法运行查询 :/
我尝试了以下查询但没有成功:
WHERE
(
    (StartDate < ScopeStartDate AND StartDate > ScopeStartDate)
    OR
    (StartDate > ScopeStartDate  AND EndDate < ScopeEndDate )
)

这给我返回了两个结果:1 和 3 我做错了什么?

如果我理解你的意思,这应该是“AND”而不是“OR”。 - Wagner Leonardi
(StartDate < ScopeStartDate AND StartDate > ScopeStartDate) 怎么可能是真的呢?它不可能既大于又小于。 - just lerning
正确的,而比较器也是错误的。 - Wagner Leonardi
4个回答

48

我相信以下条件适用于每种可能的重叠情况。

WHERE
(
    (ScopeStartDate <= EndDate AND ScopeEndDate >= StartDate)

)

除非您声明不合逻辑的时间跨度(例如,那些在开始之前就结束的时间跨度)


如果我传递像 scopeStartDate2013-09-23scopeEndDate2013-11-02 这样的值,这个条件不会失败吗?考虑上述查询: | 1 | KUVX-21-40 | 2013-10-23 | 2013-11-22 |这条记录虽然日期有重叠,但它并不满足您的条件。 - Sandeep Garg
scopeStartDate <= 2013-11-02 检查。scopeEndDate>=2013-09-23,检查。 - ffflabs

4

这是一个旧帖子,但使用BETWEEN。这是我时间钟的摘录,请根据您的需要进行修改...

$qs = "SELECT COUNT(*) AS `count` FROM `timeclock` WHERE `userid` = :userid 
                AND (
                    (`timein` BETWEEN :timein AND :timeout OR `timeout` BETWEEN :timein AND :timeout )
                    OR
                    (:timein BETWEEN `timein` AND `timeout` OR :timeout BETWEEN `timein` AND `timeout`)
                    );";

1

这只是where子句。给定的InputStartDate和InputEndDate由用户输入,而DataStartDate和DataEndDate是表中的datetime值:

where ((DataEndDate > InputStartDate) and (DataStartDate < InputEndDate))

0

您可以通过以下方式处理所有日期重叠的情况,即使数据库中的toDate可能为空:

SELECT * FROM `tableName` t
WHERE t.`startDate` <= $toDate
AND (t.`endDate` IS NULL OR t.`endDate` >= $startDate);

这将返回所有与新开始/结束日期有任何重叠的记录。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接