确定两个日期范围是否重叠

确定两个日期范围是否重叠

给定两个日期范围,确定两个日期范围是否重叠的最简单或最有效的方法是什么?

举个例子,假设我们有通过日期时间变量表示的范围StartDate1EndDate1  StartDate2EndDate2


茅侃侃
浏览 1016回答 3
3回答

跃然一笑

(StartA <= EndB)和(EndA> = StartB)证明:让ConditionA意味着DateRange完全在DateRange B之后_ &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;|---- DateRange A ------| |---Date Range B -----| &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; _(如果是,则为True&nbsp;StartA > EndB)让ConditionB表示DateRange A完全在DateRange B之前|---- DateRange A -----| &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; _ _ &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;|---Date Range B ----|(如果是,则为True&nbsp;EndA < StartB)然后,如果A Nor B都不为真,则存在重叠 -&nbsp;(如果一个范围既不完全在另一个范围之后,也不完全在另一个之前,那么它们必须重叠。)现在,德摩根的一项法律规定:Not (A Or B)&nbsp;<=>&nbsp;Not A And Not B这意味着:&nbsp;(StartA <= EndB) &nbsp;and &nbsp;(EndA >= StartB)注意:这包括边缘完全重叠的条件。如果你想排除,改变>=运营商>,并<=&nbsp;以<笔记2。由于@Baodad,看到这个博客,实际的重叠是最少:{&nbsp;endA-startA,endA - startB,endB-startA,endB - startB}(StartA <= EndB) &nbsp;and &nbsp;(EndA >= StartB)&nbsp;(StartA <= EndB) &nbsp;and &nbsp;(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))&nbsp;或:(Max(StartA, StartB) <= Min(EndA, EndB)但要实现Min()和Max(),你必须代码,(使用简洁Ç三元),:(StartA > StartB? Start A: StartB) <= (EndA < EndB? EndA: EndB)

翻翻过去那场雪

我认为,如果符合以下条件,两个范围重叠就足够了:(StartDate1&nbsp;<=&nbsp;EndDate2)&nbsp;and&nbsp;(StartDate2&nbsp;<=&nbsp;EndDate1)
打开App,查看更多内容
随时随地看视频慕课网APP