Этот вопрос может быть обработан небольшим обобщением Charles Bretana's excellent answer на этот вопрос.
Пусть Конда Среднее DateRange Полностью После DateRange B (True, если Старта> EndB) Пусть CondB Mean DateRange полностью Перед DateRange B (True, если EndA < StartB)
В этом случае, если предположить, вы хотите, чтобы нулевая дата представляла «никакую начальную/конечную границу», условия изменены.Например, для CondA
, чтобы DateRange A был полностью после DateRange B, DateRange A должен иметь определенное время начала, DateRange B должен иметь определенное конечное время, и время начала A должно быть после окончания времени окончания из B:
CondA := (StartA != null) && (EndB != null) && (StartA > EndB)
CondB
То же самое с а и в переключаются:
CondB := (StartB != null) && (EndA != null) && (StartB > EndA)
Продолжение,
Тогда Перекрытие существует, если ни А, ни В истинно
Overlap := !(CondA || CondB)
и
Теперь закон де Моргана, я думаю, что это, говорит, что
Не (A или B) < = > Not 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
не имеет значения null, ваше первое условие закончится сравнением StartA <= NULL
. На большинстве языков, с которыми я знаком, это условие ошибки.
вы получите сообщение об ошибке, если значение StartA равно null, поскольку оператор сравнения не работает с нулем. Преобразуйте все или Gate {Logic} в и {Logic}, затем реорганизуйте инструкции, поместив все значение null в начале, чтобы короткое замыкание и {Logic} работали. –