3 回答
TA贡献1826条经验 获得超6个赞
(StartA <= EndB)和(EndA> = StartB)
证明:
让ConditionA意味着DateRange完全在DateRange B之后_ |---- DateRange A ------|
|---Date Range B -----| _
(如果是,则为True StartA > EndB
)
让ConditionB表示DateRange A完全在DateRange B之前|---- DateRange A -----| _
_ |---Date Range B ----|
(如果是,则为True EndA < StartB
)
然后,如果A Nor B都不为真,则存在重叠 -
(如果一个范围既不完全在另一个范围之后,
也不完全在另一个之前,那么它们必须重叠。)
Not (A Or B)
<=> Not A And Not B
这意味着: (StartA <= EndB) and (EndA >= StartB)
注意:这包括边缘完全重叠的条件。如果你想排除,
改变>=
运营商>
,并<=
以<
笔记2。由于@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)
这实际上是更长实现的语法快捷方式,其中包括额外的检查以验证开始日期是在endDates之前还是之前。从上面得出这个:
如果开始日期和结束日期可能不正常,即,如果有可能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()
,你必须代码,(使用简洁Ç三元),:(StartA > StartB? Start A: StartB) <= (EndA < EndB? EndA: EndB)
TA贡献2065条经验 获得超13个赞
我认为,如果符合以下条件,两个范围重叠就足够了:
(StartDate1 <= EndDate2) and (StartDate2 <= EndDate1)
添加回答
举报