2013-11-02 109 views
3

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

我的数据库看起来像这样

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

在我的查询我指定的范围:一个开始日期和结束日期 让ASIGN它们如下:

ScopeStartDate = "2013-10-1" 
ScopeEndDate = "2013-11-26" 

以上应该返回我所有的记录,因为全部都是时间跨度。

但是我不能让查询工作:/

我已经试过,没有运气以下查询:

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

这将返回我的两个结果: 1和3

我做错了什么?

+0

如果我明白你想,这应该是什么“和” insted的的“OR” –

+0

哪有'(起始日期 ScopeStartDate)“永远是真的吗?它不能越来越小。 –

+0

正确,比较器也是错误的。 –

回答

25

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

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

) 

除了如果声明不合逻辑的时间跨度(例如,那些端起动前)

+0

这看起来像是在工作,我会尽快批准你的答案:D – Jazerix

+0

非常好,简单! –

0

这仅仅是where子句。鉴于InputStartDate和InputEndDate由用户输入给出,并且DataStartDate和DataEndDate是在表中的日期时间值:

,其中((DataEndDate> InputStartDate)和(DataStartDate < InputEndDate))

0

这是一个古老的线程,但使用BETWEEN。这是从我的时钟进度的exerpt,请修改您的需求...

$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`) 
        );"; 
相关问题