2017-12-02 22 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

당신은 날짜 비교 대신 ANDOR 조건을 취소 할 수 있습니다. 또한

는 이전 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