6

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

我的数据库看起来像这样

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

4 回答 4

45

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

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

)

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

于 2013-11-02T16:06:35.713 回答
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`)
                    );";
于 2018-03-03T22:07:55.630 回答
1

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

where ((DataEndDate > InputStartDate) and (DataStartDate < InputEndDate))
于 2016-02-19T18:01:54.860 回答
0

即使toDate在数据库中可能为空时,您也可以涵盖所有日期重叠情况,如下所示:

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

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

于 2020-05-07T18:18:13.450 回答