Этот случай может быть обработан небольшим обобщением Отличный ответ Чарльза Бретаны на этот вопрос.
Пусть CondA означает DateRange A полностью после DateRange B (True, если StartA> EndB)
Пусть CondB означает DateRange A полностью перед DateRange B (True, если EndA
В этом случае, если вы хотите, чтобы нулевая дата представляла «отсутствие начальной / конечной границы», условия изменяются. Например, для CondA
, чтобы DateRange A был полностью после DateRange B, DateRange A должен иметь определенное время начала, DateRange B должен иметь определенное время окончания, и время начала A должно быть после времени окончания B:
CondA := (StartA != null) && (EndB != null) && (StartA > EndB)
CondB
то же самое с переключенными A и B:
CondB := (StartB != null) && (EndA != null) && (StartB > EndA)
Постоянно
Тогда перекрытие существует, если ни A, ни B не верны
Overlap := !(CondA || CondB)
и
Теперь закон де Моргана, я так думаю, гласит, что
Не (A или B) <=> Не A и не B
Overlap == !CondA && !CondB
== ![(StartA != null) && (EndB != null) && (StartA > EndB)] &&
![(StartB != null) && (EndA != null) && (StartB > EndA)]
== [(StartA == null) || (EndB == null) || (StartA <= EndB)] &&
[(StartB == null) || (EndA == null) || (StartB <= EndA)]
Я думаю, что это на самом деле немного более надежно, чем решение, которое вы разработали, потому что если EndB == NULL
, но StartA
не равно нулю, ваше первое условие будет сравнивать StartA <= NULL
. В большинстве языков, с которыми я знаком, это условие ошибки.