Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Check overlap of date ranges in MySQL

This table is used to store sessions (events):

CREATE TABLE session (   id int(11) NOT NULL AUTO_INCREMENT , start_date date , end_date date );  INSERT INTO session   (start_date, end_date) VALUES   ("2010-01-01", "2010-01-10") , ("2010-01-20", "2010-01-30") , ("2010-02-01", "2010-02-15") ; 

We don't want to have conflict between ranges.
Let's say we need to insert a new session from 2010-01-05 to 2010-01-25.
We would like to know the conflicting session(s).

Here is my query:

SELECT * FROM session WHERE "2010-01-05" BETWEEN start_date AND end_date    OR "2010-01-25" BETWEEN start_date AND end_date    OR "2010-01-05" >= start_date AND "2010-01-25" <= end_date ; 

Here is the result:

+----+------------+------------+ | id | start_date | end_date   | +----+------------+------------+ |  1 | 2010-01-01 | 2010-01-10 | |  2 | 2010-01-20 | 2010-01-30 | +----+------------+------------+ 

Is there a better way to get that?


fiddle

like image 941
Pierre de LESPINAY Avatar asked Mar 30 '10 14:03

Pierre de LESPINAY


2 Answers

I had such a query with a calendar application I once wrote. I think I used something like this:

... WHERE new_start < existing_end       AND new_end   > existing_start; 

UPDATE This should definitely work ((ns, ne, es, ee) = (new_start, new_end, existing_start, existing_end)):

  1. ns - ne - es - ee: doesn't overlap and doesn't match (because ne < es)
  2. ns - es - ne - ee: overlaps and matches
  3. es - ns - ee - ne: overlaps and matches
  4. es - ee - ns - ne: doesn't overlap and doesn't match (because ns > ee)
  5. es - ns - ne - ee: overlaps and matches
  6. ns - es - ee - ne: overlaps and matches

Here is a fiddle

like image 76
soulmerge Avatar answered Oct 10 '22 05:10

soulmerge


SELECT * FROM tbl WHERE existing_start BETWEEN $newStart AND $newEnd OR  existing_end BETWEEN $newStart AND $newEnd OR $newStart BETWEEN existing_start AND existing_end  if (!empty($result)) throw new Exception('We have overlapping') 

These 3 lines of sql clauses cover the 4 cases of overlapping required.

like image 37
Yasen Avatar answered Oct 10 '22 07:10

Yasen