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

时间:2013-11-02 16:01:37

标签: mysql sql datetime

我需要检查我的数据库中是否有两个日期和另外两个日期。

我的数据库看起来像这样

+----+--------------+------------+------------+
| 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

我做错了什么?

4 个答案:

答案 0 :(得分:29)

我认为以下条件符合每个可能的重叠案例。

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

)

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

答案 1 :(得分:1)

这只是where子句。给定InputStartDate和InputEndDate由用户输入给出,DataStartDate和DataEndDate是表中的日期时间值:

where((DataEndDate&gt; InputStartDate)和(DataStartDate&lt; InputEndDate))

答案 2 :(得分:1)

这是一个旧线程,但使用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`)
                    );";

答案 3 :(得分:0)

即使数据库中的toDate可能为null,您也可以覆盖所有日期重叠的情况,如下所示:

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

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