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

问题描述 投票:4回答:3

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

我的数据库看起来像这样

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

我究竟做错了什么?

mysql sql datetime
3个回答
29
投票

我相信以下条件匹配每个可能的重叠情况。

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

)

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


1
投票

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

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


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`)
                    );";
© www.soinside.com 2019 - 2024. All rights reserved.