web-dev-qa-db-ja.com

2つの日付の間ではないSQLクエリ

SQLクエリについてサポートが必要です。

2つの日付「2009-12-15」と「2010-01-02」の間に収まらないすべてのレコードをテーブルtest_tableから選択しようとしています。

これは私のテーブル構造です:

`start_date` date NOT NULL default '0000-00-00',
`end_date` date NOT NULL default '0000-00-00'

-----------------------------
 **The following record should not be selected:**

`start_date`, `end_date`
'2003-06-04', '2010-01-01'

私のクエリ:

SELECT * 

FROM `test_table` 
WHERE 

CAST('2009-12-15' AS DATE) NOT BETWEEN start_date and end_date 
AND 
CAST('2010-01-02' AS DATE) NOT BETWEEN start_date and end_date

クエリが間違ったレコードを選択する理由は何ですか?クエリの値の順序を次のように変更する必要があります:

start_date NOT BETWEEN CAST('2009-12-15' AS DATE) and CAST('2010-01-02' AS DATE)

助けてくれてありがとう

17
Kelvin

試してみてはいかがですか:

select * from 'test_table'
where end_date < CAST('2009-12-15' AS DATE)
or start_date > CAST('2010-01-02' AS DATE)

これは、日付範囲とまったく重ならないすべての日付範囲を返します。

27
Jim Lynn

あなたの論理は逆です。

SELECT 
    *
FROM 
    `test_table`
WHERE
        start_date NOT BETWEEN CAST('2009-12-15' AS DATE) and CAST('2010-01-02' AS DATE)
    AND end_date NOT BETWEEN CAST('2009-12-15' AS DATE) and CAST('2010-01-02' AS DATE)
8
Dereleased

選択した行の日付範囲が指定された日付範囲内に完全に収まるべきではないということですか?その場合:

select *
from test_table
where start_date < date '2009-12-15'
or end_date > date '2010-01-02';

(上記の構文はOracle用であり、若干異なる場合があります)。

2
Tony Andrews

現在実行しているのは、start_dateとend_dateのどちらも指定された日付の範囲内にないかどうかを確認することです。

あなたが本当に探しているのは、指定された日付範囲にfitを含まないレコードだと思います。その場合は、以下のクエリを使用してください。

SELECT * 
    FROM `test_table` 
    WHERE  CAST('2009-12-15' AS DATE) > start_date  AND  CAST('2010-01-02' AS DATE) < end_date
1

'NOT'がstart_dateの前に置かれていれば、機能するはずです。何らかの理由で(理由はわかりません)、「NOT」が「BETWEEN」の前に置かれると、すべてが返されるようです。

NOT (start_date BETWEEN CAST('2009-12-15' AS DATE) AND CAST('2010-01-02' AS DATE))
1
brandonstrong

Start_dateがend_dateより前であると仮定すると、

interval [start_date..end_date] NOT BETWEEN 2つの日付は、2009-12-15より前に開始するか、2010-01-02より後に終了することを意味します。

その後、あなたは単に行うことができます

start_date<CAST('2009-12-15' AS DATE) or end_date>CAST('2010-01-02' AS DATE)
0
yu_sha

オーバーラップが存在するためには、テーブルのstart_dateが間隔の終了日よりも短くなければなりません(つまり、間隔の終了前に開始する必要があります)、テーブルのend_dateは間隔の開始日よりも大きくなければなりません。要件によっては、<=および> =を使用する必要がある場合があります。

0
Jim Garrison