(StartA & lt; = EndB) и (EndA> = StartB)
Доказательство: Пусть ConditionA означает, что DateRange A полностью после DateRange B _ |---- DateRange A ------|
|---Date Range B -----| _
(True, если StartA > EndB
)
Пусть ConditionB означает, что DateRange A полностью до DateRange B |---- DateRange A -----| _
_ |---Date Range B ----|
(True, если EndA < StartB
)
Затем Overlap существует, если ни A Nor B не является истинным - ( Если один диапазон не является полностью ни за другим, ни полностью перед другим, то они должны перекрываться.)
Теперь один из законов Де Моргана говорит, что:
Not (A Or B)
& lt; => Not A And Not B
Что означает: (StartA <= EndB) and (EndA >= StartB)
ПРИМЕЧАНИЕ. Сюда входят условия, при которых края накладываются точно. Если вы хотите исключить это, измените операторы >=
на >
и <=
на <
NOTE2. Благодаря @Baodad, см. этот блог , фактическое перекрытие меньше всего: {endA-startA
, endA - startB
, endB-startA
, endB - startB
}
(StartA <= EndB) and (EndA >= StartB)
(StartA <= EndB) and (StartB <= EndA)
ПРИМЕЧАНИЕ 3. Благодаря @tomosius более короткая версия читает: DateRangesOverlap = max(start1, start2) < min(end1, end2)
Это на самом деле синтаксический ярлык для более длинной реализации, который включает дополнительные проверки, чтобы проверить, что даты начала включены или до конца. Вывод этого сверху:
Если даты начала и окончания могут быть не в порядке, то есть, если возможно, что startA > endA
или startB > endB
, тогда вы также должны проверить, что они в порядке, так что вы должны добавить два дополнительных правила достоверности: (StartA <= EndB) and (StartB <= EndA) and (StartA <= EndA) and (StartB <= EndB)
или: (StartA <= EndB) and (StartA <= EndA) and (StartB <= EndA) and (StartB <= EndB)
или (StartA <= Min(EndA, EndB) and (StartB <= Min(EndA, EndB))
или: (Max(StartA, StartB) <= Min(EndA, EndB)
Но для реализации Min()
и Max()
у вас есть для кода, (используя C тройной для скручивания) ,: (StartA > StartB? Start A: StartB) <= (EndA < EndB? EndA: EndB)