2

我有一个包含多个合同的表,每个合同都有一个开始日期和一个结束日期,如下所示:

|  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 |

我要做的是构建一个查询,该查询将检索在特定时间段之间处于活动状态的合同。因此,如果我有开始日期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'

但这不起作用,不会检索任何记录。我究竟做错了什么?

4

5 回答 5

4
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');

检查 SQL 小提琴

于 2013-03-21T14:03:16.123 回答
3

呃,时间是线性的对吧?

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

让我举例说明...

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

在上述所有情况下,开始日期都小于 B。结束日期大于 A。

于 2013-03-20T10:59:44.563 回答
0

对我来说,一个好的要求将是

SELECT * FROM contracts c WHERE c.startdate >'2012-02-10' AND c.enddate < '2012-03-21'
于 2013-03-20T10:42:29.593 回答
0

应该是这样的

SELECT *
FROM contracts c
WHERE c.startdate >= '2012-02-10'
    AND c.enddate <= '2012-03-21'
于 2013-03-20T10:49:10.800 回答
0
    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');

解释:

(START_DATE between '2012-03-01' AND '2013-03-21')  

: 在输入日期之间开始的间隔记录。可能包括间隔的第一部分或全部。

(END_DATE between '2012-03-01' AND '2013-03-21') 

:在输入日期之间结束的时间间隔。可能包括间隔的最后一部分或全部。

(START_DATE<= '2012-03-01' AND END_DATE >='2013-03-21') 

: 输入日期仅包含在一个时间间隔内

于 2020-04-21T11:59:27.090 回答