2013-11-02 108 views
3

我需要檢查兩個日期是否與我的數據庫中的另外兩個日期重疊。MySQL檢查兩個日期範圍是否與輸入重疊

我的數據庫看起來像這樣

+----+--------------+------------+------------+ 
| id | code   | StartDate | EndDate | 
+----+--------------+------------+------------+ 
| 1 | KUVX-21-40 | 2013-10-23 | 2013-11-22 | 
| 2 | UEXA286-1273 | 2013-10-30 | 2013-11-29 | 
| 3 | UAJFAU-2817 | 2013-10-21 | 2013-11-20 | 
| 4 | KUVX-21-40 | 2013-10-30 | 2013-11-29 | 
+----+--------------+------------+------------+ 

在我的查詢我指定的範圍:一個開始日期和結束日期 讓ASIGN它們如下:

ScopeStartDate = "2013-10-1" 
ScopeEndDate = "2013-11-26" 

以上應該返回我所有的記錄,因爲全部都是時間跨度。

但是我不能讓查詢工作:/

我已經試過,沒有運氣以下查詢:

WHERE 
(
    (StartDate < ScopeStartDate AND StartDate > ScopeStartDate) 
    OR 
    (StartDate > ScopeStartDate AND EndDate < ScopeEndDate) 
) 

這將返回我的兩個結果: 1和3

我做錯了什麼?

+0

如果我明白你想,這應該是什麼「和」 insted的的「OR」 –

+0

哪有'(起始日期 ScopeStartDate)「永遠是真的嗎?它不能越來越小。 –

+0

正確,比較器也是錯誤的。 –

回答

25

我相信以下條件匹配每一個可能的重疊情況。

WHERE 
(
    (ScopeStartDate <= EndDate AND ScopeEndDate >= StartDate) 

) 

除了如果聲明不合邏輯的時間跨度(例如,那些端起動前)

+0

這看起來像是在工作,我會盡快批准你的答案:D – Jazerix

+0

非常好,簡單! –

0

這僅僅是where子句。鑑於InputStartDate和InputEndDate由用戶輸入給出,並且DataStartDate和DataEndDate是在表中的日期時間值:

,其中((DataEndDate> InputStartDate)和(DataStartDate < InputEndDate))

0

這是一個古老的線程,但使用BETWEEN。這是從我的時鐘進度的exerpt,請修改您的需求...

$qs = "SELECT COUNT(*) AS `count` FROM `timeclock` WHERE `userid` = :userid 
       AND (
        (`timein` BETWEEN :timein AND :timeout OR `timeout` BETWEEN :timein AND :timeout) 
        OR 
        (:timein BETWEEN `timein` AND `timeout` OR :timeout BETWEEN `timein` AND `timeout`) 
        );"; 
相關問題