具有可空日期的日期范围重叠

Jos*_*osh 5 language-agnostic math datetime

我正在寻找这里提出的问题的扩展答案:

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

其中任一日期范围中的任何日期都可以为null.我已经提出了以下解决方案,但我不确定它是否可以进一步简化.

(StartA == NULL || StartA <= EndB) &&
(EndA == NULL || EndA >= StartB) &&
(StartB == NULL || StartB <= EndA) &&
(EndB == NULL || EndB >= StartA)
Run Code Online (Sandbox Code Playgroud)

假设:

StartA到EndA和StartB到EndB的DateTime范围

编辑: 对不起,我很快将上述逻辑放在一起,当范围的开始和结束日期都为NULL时,这似乎失败了.请参阅下面的David的解决方案,以获得更好和更好解释的方法.

Dav*_*d Z 12

这个案例可以通过查尔斯布雷塔纳对这个问题的出色答案的略微概括来处理.

设CondA平均DateRange完全在DateRange B之后(如果StartA> EndB则为真)让CondB平均DateRange A完全在DateRange B之前(如果EndA <StartB则为真)

在这种情况下,假设您希望空日期表示"无开始/结束边界",则会修改条件.例如CondA,为了使DateRange A完全在DateRange B之后,DateRange A必须具有定义的开始时间,DateRange B必须具有定义的结束时间,并且 A的开始时间必须在B的结束时间之后:

CondA := (StartA != null) && (EndB != null) && (StartA > EndB)
Run Code Online (Sandbox Code Playgroud)

CondB 与A和B切换相同:

CondB := (StartB != null) && (EndA != null) && (StartB > EndA)
Run Code Online (Sandbox Code Playgroud)

继续,

如果A Nor B都不成立则存在重叠

Overlap := !(CondA || CondB)
Run Code Online (Sandbox Code Playgroud)

现在deMorgan的法律,我认为是,说

不是(A或B)<=>不是A而不是B.

Overlap == !CondA && !CondB
        == ![(StartA != null) && (EndB != null) && (StartA > EndB)] &&
           ![(StartB != null) && (EndA != null) && (StartB > EndA)]
        == [(StartA == null) || (EndB == null) || (StartA <= EndB)] &&
           [(StartB == null) || (EndA == null) || (StartB <= EndA)]
Run Code Online (Sandbox Code Playgroud)

我认为这实际上比你开发的解决方案更强大,因为如果EndB == NULLStartA不是null,你的第一个条件将结束比较StartA <= NULL.在我熟悉的大多数语言中,这是一个错误条件.