Это расширение превосходного ответа от @ charles-bretana.
Однако в ответе не проводится различие между открытым, закрытым и полуоткрытым (или полузакрытым) интервалами.
Случай 1 : A, B - закрытые интервалы
A = [StartA, EndA]
B = [StartB, EndB]
[---- DateRange A ------] (True if StartA > EndB)
[--- Date Range B -----]
[---- DateRange A -----] (True if EndA < StartB)
[--- Date Range B ----]
Перекрытие, если: (StartA <= EndB) and (EndA >= StartB)
Случай 2 : A, B - открытые интервалы
A = (StartA, EndA)
B = (StartB, EndB)
(---- DateRange A ------) (True if StartA >= EndB)
(--- Date Range B -----)
(---- DateRange A -----) (True if EndA <= StartB)
(--- Date Range B ----)
Перекрытие, если: (StartA < EndB) and (EndA > StartB)
Дело 3 : A, B справа открыто
A = [StartA, EndA)
B = [StartB, EndB)
[---- DateRange A ------) (True if StartA >= EndB)
[--- Date Range B -----)
[---- DateRange A -----) (True if EndA <= StartB)
[--- Date Range B ----)
Условие перекрытия: (StartA < EndB) and (EndA > StartB)
Дело 4 : A, B оставлено открытым
A = (StartA, EndA]
B = (StartB, EndB]
(---- DateRange A ------] (True if StartA >= EndB)
(--- Date Range B -----]
(---- DateRange A -----] (True if EndA <= StartB)
(--- Date Range B ----]
Условие перекрытия: (StartA < EndB) and (EndA > StartB)
Дело 5 : Право открыто, B закрыто
A = [StartA, EndA)
B = [StartB, EndB]
[---- DateRange A ------) (True if StartA > EndB)
[--- Date Range B -----]
[---- DateRange A -----) (True if EndA <= StartB)
[--- Date Range B ----]
Условие перекрытия: (StartA <= EndB) and (EndA > StartB)
и т.д ...
Наконец, общее условие для двух интервалов перекрытия:
(StartA <? EndB) и (EndA> ? StartB)
где ? превращает строгое неравенство в нестрогое всякий раз, когда проводится сравнение между двумя включенными конечными точками.