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)
助けてくれてありがとう
試してみてはいかがですか:
select * from 'test_table'
where end_date < CAST('2009-12-15' AS DATE)
or start_date > CAST('2010-01-02' AS DATE)
これは、日付範囲とまったく重ならないすべての日付範囲を返します。
あなたの論理は逆です。
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)
選択した行の日付範囲が指定された日付範囲内に完全に収まるべきではないということですか?その場合:
select *
from test_table
where start_date < date '2009-12-15'
or end_date > date '2010-01-02';
(上記の構文はOracle用であり、若干異なる場合があります)。
現在実行しているのは、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
'NOT'がstart_dateの前に置かれていれば、機能するはずです。何らかの理由で(理由はわかりません)、「NOT」が「BETWEEN」の前に置かれると、すべてが返されるようです。
NOT (start_date BETWEEN CAST('2009-12-15' AS DATE) AND CAST('2010-01-02' AS DATE))
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)
オーバーラップが存在するためには、テーブルのstart_dateが間隔の終了日よりも短くなければなりません(つまり、間隔の終了前に開始する必要があります)、テーブルのend_dateは間隔の開始日よりも大きくなければなりません。要件によっては、<=および> =を使用する必要がある場合があります。