I\'ve been thinking on how I can simplify the problem presented here. Complex MySQL Query - Checking for overlapping DATE intervals
At it\'s heart, minus all the fa
You can phrase an insert as:
insert into schedules(start, end)
select s, e
from (select $start s, $end as e) t
where not exists (select 1
from schedules s2
where s.start <= t.end and s.end >= t.start
);
This will only insert the value if it doesn't overlap with an existing row in the table.
Using folowing abbreviations:
the condition for overlaping of two ranges (old and new) is: (OS < NE) AND (OE > NS)
While the solution might be not trivial, its not that difficult to get there:
There is no overlaping if the new range is completly before or after the existing range: [new] <= [old] OR [old] <= [new]
and that means that:
(NE <= OS) OR (OE <= NS)
Negotiating this statement we get the condition for overlaping:
!( (NE <= OS) OR (OE <= NS) )
Now using De Morgan's law we can write it as
!(NE <= OS) AND !(OE <= NS)
And this is equivalent to
(NE > OS) AND (OE > NS)
wich can be rewriten as
(OS < NE) AND (OE > NS)
Now we can find all overlaping ranges using
SELECT o.*
FROM Schedules o
WHERE o.start < :new_end
AND o.end > :new_start