为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

茅侃侃 2019-05-23 10:57:39
确定两个日期范围是否重叠给定两个日期范围,确定两个日期范围是否重叠的最简单或最有效的方法是什么?举个例子,假设我们有通过日期时间变量表示的范围StartDate1来EndDate1 和 StartDate2到EndDate2。
查看完整描述

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-startAendA - startBendB-startAendB - 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)


查看完整回答
反对 回复 2019-05-23
?
翻翻过去那场雪

TA贡献2065条经验 获得超13个赞

我认为,如果符合以下条件,两个范围重叠就足够了:

(StartDate1 <= EndDate2) and (StartDate2 <= EndDate1)


查看完整回答
反对 回复 2019-05-23
  • 3 回答
  • 0 关注
  • 959 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信