У меня была ситуация, когда у нас были даты, а не даты, и даты могут перекрываться только с начала / конца. Пример ниже:
(зеленый - текущий интервал, синие блоки - это допустимые интервалы, красные - перекрывающиеся интервалы).
Я адаптировал ответ Яна Нельсона на следующее решение:
(startB <= startA && endB > startA)
|| (startB >= startA && startB < endA)
Это соответствует всем случаям перекрытия, но игнорирует разрешенные совпадения.