起因
最近在做一個需求:判斷時間輸入時間段(開始時間、結束時間)是否跟數據庫已有數據重疊。什么叫重疊呢?
根據常規的認知,以上四種情況都被認為是時間的重疊。
解決方法
前提假設:
數據
開始時間 < 結束時間
php
待判斷開始時間:$start_time
待判斷結束時間:$end_time
mysql
表名:test
表開始時間字段:start_time
表結束時間字段:end_time
常規判斷重疊方法(判斷四種情況):
select count('x') from test where
(start_time < ‘$start_time’ && end_time > ‘$start_time’ && end_time < ‘$end_time’) -- 情況一
or (start_time > ‘$start_time’ && end_time < ‘$end_time’) -- 情況二
or (start_time > ‘$start_time’ && start_time < ‘$end_time’ && end_time < ‘$end_time’) -- 情況三
or (start_time < ‘$start_time’ && end_time > ‘$end_time’) -- 情況四
巧妙判斷重疊方法(判斷兩種情況):
select count('x') from test where (start_time < ‘$end_time’) and (end_time > ‘$start_time’)
結論
「巧妙判斷重疊方法」是同事告訴我的,一開始我對這種判斷方式是抗拒的,覺得明明需要四個條件判斷才能實現的需求,怎么可能只通過兩個條件實現呢,一定要找出一個反例。
后來我放棄了,這其實是數學問題,比如一個數大於10,那么它一定大於5。