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

: 入力日付は 1 つの間隔内にのみ含まれます

于 2020-04-21T11:59:27.090 に答える