Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

MySQL check if two date range overlap with input

I need to check if two dates over lap with another two dates in my database.

My database looks like this

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

In my query i specify the scope: A start date and an enddate Lets asign them as follows:

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

Above should return me all of the records, since the all overlapse the timespan.

However I cannot get a query working :/

I've tried the following query with no luck:

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

This returns me two results: 1 and 3

what am I doing wrong?

like image 623
Jazerix Avatar asked Nov 02 '13 16:11

Jazerix


2 Answers

I believe the following condition matches every possible overlapping case.

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

)

except if you declare illogic timespans (for example, those which end before starting)

like image 117
ffflabs Avatar answered Oct 31 '22 03:10

ffflabs


This is an old thread, but use BETWEEN. This is an excerpt from my timeclock, pls modify to your needs...

$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`)
                    );";
like image 42
Paul Ishak Avatar answered Oct 31 '22 03:10

Paul Ishak