2013-03-20 114 views
1

我有一個包含幾個合約表,每個合約都有一個開始日期和結束日期,就像這樣:檢索中的特定日期範圍內發生的所有記錄在MySQL

| ID | Contract Name | Start Date | End Date | 
|-------|-------------------|--------------|------------| 
| 1 | Joe Bloggs  | 2012-01-01 | 2012-02-05 | 
| 2 | John Smiths  | 2012-02-01 | 2012-02-20 | 
| 3 | Johnny Briggs | 2012-03-01 | 2012-03-20 | 

什麼我想do是建立一個查詢,它將檢索在特定時間段內處於活動狀態的合同。所以,如果我有2012-02-10開始日期和2012-03-21結束日期,我應該有顯示如下合同:

| ID | Contract Name | Start Date | End Date | 
|-------|-------------------|--------------|------------| 
| 2 | John Smiths  | 2012-02-01 | 2012-02-20 | 
| 3 | Johnny Briggs | 2012-03-01 | 2012-03-20 | 

我的思想的問題是,我不知道如何建立查詢,以做到這一點。這是我到目前爲止:

SELECT * 
FROM contracts c 
WHERE c.startdate BETWEEN '2012-02-10' 
    AND '2012-03-21' 
    AND c.enddate BETWEEN '2012-02-10' 
    AND '2012-03-21' 

雖然這不工作,沒有記錄檢索。我究竟做錯了什麼?

+0

ID = 2開始日期在您搜索的開始日期之前。 – JoDev 2013-03-20 10:41:41

回答

3

呃,時間是線性的吧?

SELECT * 
FROM contracts 
WHERE end_date >= '2012-02-10' 
AND start_date <= '2012-03-21'; 

讓我說明...

A-------------B 
<-------> 
     <------> 
      <-----------> 
<----------------------> 

在上述所有情況下,開始日期小於B的結束日期比A.

+1

不錯!這一個是正確的。 :d! – reto 2013-03-21 14:35:00

0

對我來說,一個良好的請求將被

SELECT * FROM contracts c WHERE c.startdate >'2012-02-10' AND c.enddate < '2012-03-21' 
0

本來應該是這樣的

SELECT * 
FROM contracts c 
WHERE c.startdate >= '2012-02-10' 
    AND c.enddate <= '2012-03-21' 
3
SELECT * FROM contracts 
       WHERE (START_DATE between '2012-03-01' AND '2013-03-21') 
       OR (END_DATE between '2012-03-01' AND '2013-03-21') 
       OR (START_DATE<= '2012-03-01' AND END_DATE >='2013-03-21'); 

Check the SQL fiddle

更大
相關問題