检索中的特定日期范围内发生的所有记录在MySQL
问题描述:
我有一个包含几个合约表,每个合约都有一个开始日期和结束日期,就像这样:检索中的特定日期范围内发生的所有记录在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'
虽然这不工作,没有记录检索。我究竟做错了什么?
答
呃,时间是线性的吧?
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
答
对我来说,一个良好的请求将被
SELECT * FROM contracts c WHERE c.startdate >'2012-02-10' AND c.enddate < '2012-03-21'
答
本来应该是这样的
SELECT *
FROM contracts c
WHERE c.startdate >= '2012-02-10'
AND c.enddate <= '2012-03-21'
答
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');
更大
ID = 2开始日期在您搜索的开始日期之前。 – JoDev 2013-03-20 10:41:41