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