2013-03-20 109 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

更大
相关问题