2017-12-02 6 views
0

日付が日付範囲内にある場合は、テーブルからデータを除外しようとしています。これは単一の日付だった場合、それは簡単で、次のようになります。複数の日付範囲をフィルタリングする - SQL

START_DATE   END_DATE   VALUE_NAME 
06-NOV-17 13:16:00 06-NOV-17 13:17:00 NAMEINQUESTION 
06-NOV-17 16:34:00 17-NOV-17 16:13:00 NAMEINQUESTION 
13-NOV-17 18:05:00 13-NOV-17 18:10:00 NAMEINQUESTION 
13-NOV-17 20:02:00 13-NOV-17 20:03:00 NAMEINQUESTION 
13-NOV-17 20:05:00 13-NOV-17 20:20:00 NAMEINQUESTION 
15-NOV-17 15:14:00 15-NOV-17 15:18:00 NAMEINQUESTION 
SELECT * FROM XYZ WHERE XYZ.DATE NOT BETWEEN DATE1 AND DATE2; 

しかし、この特定の要件のために、私は別のテーブルに保存され、コンペアしたい多くの日付(EXCLUDE_THESE_DATES)を持っている

私はこれらの日付に該当するすべての値を取得することができましたが、私が本当に探しているものは何も得られないようです(その日付帯にない日付)。

SELECT 
FLD.VALUE, FLD.FILTERDATE, ETED.START_DATE, ETED.END_DATE 
FROM 
    FULL_LIST_OF_DATES FLD, 
    EXCLUDE_THESE_DATES ETD 
WHERE FLD.VALUE_NAME = ETD.VALUE_NAME 
AND FLD.VALUE_TYPE_ID = 1007 
AND FLD.FILTERDATE BETWEEN '01-OCT-17 00:00:00' AND '01-APR-18 
00:00:00' 
AND (FLD.FILTERDATE >= ETED.START_DATE 
AND FLD.FILTERDATE <= ETED.END_DATE) 
AND FLD.VALUE_NAME = 'NAMEINQUESTION' 

どのような援助をいただければ幸いです!

編集: フィードバックに基づく結果。 16:34:51は06-NOV-17 16:34:00から17-NOV-17 16:13:00にも入っていたので表示されません。

VALUE  FILTERDATE   START_DATE   END_DATE 
480.703461 06-NOV-17 16:34:51 28-NOV-17 13:26:00 29-NOV-17 23:36:00 
480.703461 06-NOV-17 16:34:51 13-NOV-17 18:05:00 13-NOV-17 18:10:00 
480.703461 06-NOV-17 16:34:51 06-NOV-17 13:16:00 06-NOV-17 13:17:00 
480.703461 06-NOV-17 16:34:51 13-NOV-17 20:05:00 13-NOV-17 20:20:00 
480.703461 06-NOV-17 16:34:51 15-NOV-17 15:14:00 15-NOV-17 15:18:00 
480.703461 06-NOV-17 16:34:51 28-NOV-17 13:10:00 28-NOV-17 13:13:00 
480.703461 06-NOV-17 16:34:51 13-NOV-17 20:02:00 13-NOV-17 20:03:00 
483.04837 06-NOV-17 16:35:19 28-NOV-17 13:26:00 29-NOV-17 23:36:00 
483.04837 06-NOV-17 16:35:19 13-NOV-17 18:05:00 13-NOV-17 18:10:00 
483.04837 06-NOV-17 16:35:19 06-NOV-17 13:16:00 06-NOV-17 13:17:00 
483.04837 06-NOV-17 16:35:19 13-NOV-17 20:05:00 13-NOV-17 20:20:00 
483.04837 06-NOV-17 16:35:19 15-NOV-17 15:14:00 15-NOV-17 15:18:00 
483.04837 06-NOV-17 16:35:19 28-NOV-17 13:10:00 28-NOV-17 13:13:00 

答えて

0

代わりANDの日付の比較やOR条件を逆にすることができます。また

は、古いa,b

SELECT 
FLD.VALUE, FLD.FILTERDATE, ETED.START_DATE, ETED.END_DATE 
FROM 
    FULL_LIST_OF_DATES FLD JOIN 
    EXCLUDE_THESE_DATES ETD 
    ON FLD.VALUE_NAME = ETD.VALUE_NAME 
WHERE FLD.VALUE_TYPE_ID = 1007 
AND FLD.FILTERDATE BETWEEN '01-OCT-17 00:00:00' AND '01-APR-18 
00:00:00' 
AND (FLD.FILTERDATE < ETED.START_DATE 
     OR FLD.FILTERDATE > ETED.END_DATE) 
AND FLD.VALUE_NAME = 'NAMEINQUESTION' 
+0

うん、いくつかの古い習慣は、ハード死ぬのではなく、JOIN ..ON構文を使用します。私はそれが私が掲示する前にやったことだと思って、私が探していた結果を私には与えなかったが、私はもう一度やり直すだろう:)。 – GregN

+0

@GregN:あなたの 'FULL_LIST_OF_DATES'のレコードを知らなくても、クエリを構築したりテストしたりするのは難しいです。上記のものがうまくいかない場合は、私が述べた' OR'条件を使って試してみてください。 –

+0

編集を追加しました。それは条件を満たしていないレコードを引っ張った。 – GregN

関連する問題