19

SQL クエリのヘルプが必要です。

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

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

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

助けてくれてありがとう

4

7 に答える 7

28

試してみてはどうですか:

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

これにより、日付範囲がまったく重ならないすべての日付範囲が返されます。

于 2009-11-09T17:25:05.737 に答える
9

あなたの論理は逆です。

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)
于 2009-11-09T17:24:46.993 に答える
3

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

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

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

于 2009-11-09T17:22:13.247 に答える
1

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

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

SELECT * 
    FROM `test_table` 
    WHERE  CAST('2009-12-15' AS DATE) > start_date  AND  CAST('2010-01-02' AS DATE) < end_date
于 2009-11-09T17:23:48.053 に答える
0

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

interval [start_date..end_date] NOT BETWEEN two date は、単に 2009 年 12 月 15 日より前に開始するか、2010 年 1 月 2 日より後に終了することを意味します。

次に、簡単に行うことができます

start_date<CAST('2009-12-15' AS DATE) or end_date>CAST('2010-01-02' AS DATE)
于 2009-11-09T17:23:19.723 に答える
0

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

于 2009-11-09T17:27:54.343 に答える