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-startA
,endA - startB
,endB-startA
,endB - startB
}
(StartA <= EndB) and (EndA >= StartB)
(StartA <= EndB) and (StartB <= EndA)
注3。感謝@tomosius,更短的版本讀?。?br/>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)

TA貢獻2065條經驗 獲得超14個贊
我認為,如果符合以下條件,兩個范圍重疊就足夠了:
(StartDate1 <= EndDate2) and (StartDate2 <= EndDate1)
添加回答
舉報