3 回答

TA貢獻(xiàn)1826條經(jīng)驗(yàn) 獲得超6個(gè)贊
(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都不為真,則存在重疊 -
(如果一個(gè)范圍既不完全在另一個(gè)范圍之后,
也不完全在另一個(gè)之前,那么它們必須重疊。)
現(xiàn)在,德摩根的一項(xiàng)法律規(guī)定:
Not (A Or B)
<=> Not A And Not B
這意味著: (StartA <= EndB) and (EndA >= StartB)
注意:這包括邊緣完全重疊的條件。如果你想排除,
改變>=
運(yùn)營(yíng)商>
,并<=
以<
筆記2。由于@Baodad,看到這個(gè)博客,實(shí)際的重疊是最少:
{ endA-startA
,endA - startB
,endB-startA
,endB - startB
}
(StartA <= EndB) and (EndA >= StartB)
(StartA <= EndB) and (StartB <= EndA)
注3。感謝@tomosius,更短的版本讀取:DateRangesOverlap = max(start1, start2) < min(end1, end2)
這實(shí)際上是更長(zhǎng)實(shí)現(xiàn)的語(yǔ)法快捷方式,其中包括額外的檢查以驗(yàn)證開始日期是在endDates之前還是之前。從上面得出這個(gè):
如果開始日期和結(jié)束日期可能不正常,即,如果有可能startA > endA
或者startB > endB
,那么您還必須檢查它們是否有序,這意味著您必須添加兩個(gè)額外的有效性規(guī)則:(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)
但要實(shí)現(xiàn)Min()
和Max()
,你必須代碼,(使用簡(jiǎn)潔?三元),:(StartA > StartB? Start A: StartB) <= (EndA < EndB? EndA: EndB)

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