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

例如,假设我们有DateTime变量StartDate1EndDate1StartDate2EndDate2表示的范围。

最佳答案

(StartA = StartB)
证明:
让ConditionA表示DateRange A完全在DateRange B之后

_                        |---- DateRange A ------|
|---Date Range B -----|                          _
(如果为StartA > EndB,则为true)
让ConditionB表示DateRange A完全早于DateRange B
|---- DateRange A -----|                        _
_                          |---Date Range B ----|
(如果为EndA < StartB,则为true)
如果A和B都不为真,则存在重叠-
(如果一个范围不完全在另一个范围之后,
也不完全在另一个之前
那么它们必须重叠。)
现在De Morgan's laws之一说:Not (A Or B) Not A And Not B转换为:(StartA <= EndB) and (EndA >= StartB)
注意:这包括边缘完全重叠的条件。如果您希望排除在外,
>=运算符更改为>,并将<=更改为<
笔记2。感谢@Baodad,请参阅this blog,实际重叠至少是:
{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 > endAstartB > 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)

09-06 08:20