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

伊恩·纳尔逊(Ian Nelson)

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

例如,假设我们有DateTime变量StartDate1toEndDate1 StartDate2to表示的范围EndDate2

查尔斯·布雷塔纳

(StartA <= 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

如果A或B都不为真,则存在重叠-
(如果一个范围既不完全在另一个范围之后,
也不完全在另一个范围之前,则它们必须重叠。)

现在,De Morgan的法律之一说:

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 > 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)

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

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

测试两个整数范围是否重叠的最有效方法是什么?

确定两个矩形是否彼此重叠?

如何检查两个日期范围是否在mysql中重叠?

python中两个日期范围之间的重叠日期

检查红宝石中两个范围是否重叠

要查找两个日期范围的重叠并将其合并到JAVA中的一个日期范围

Postgres重叠日期查询-查看两个日期是否重叠一个月

Dynamodb找不到两个日期范围之间的重叠

如何在C / C ++中检查两个任意内存范围是否没有重叠

检查两个“时间范围”是否相互重叠

如何确定两个矩形是否重叠(成角度)

在两个表中查找重叠的日期范围

确定两个日期是否在允许的时间范围内

从R中的两个独立数据库计算每个重叠日期范围

尝试使用R确定两个日期范围是否重叠

检查两个日期段是否重叠

两个日期范围之间有多少小时重叠

检查是否有两个以上的日期范围重叠

T-SQL函数,用于确定两个整数范围是否重叠

如何确定当前日期是否在两个不包含年份的日期范围之内/之外?

确定两个日期范围是否重叠,如果是,我如何获得具有新的开始和结束时间的重叠时间

确定输入日期范围是否与现有日期范围重叠

检查两个矩形是否重叠

确定两个时间范围是否重叠

确定2个日期范围是否重叠excel

检查两个 GeoJSON 是否重叠

确定两个日期之间是否存在值

确定两个循环时间是否重叠