2012-02-02 7 views
1

SQL Server에 다양한 날짜 범위를 포함하는 테이블이 있습니다.날짜가 여러 날짜 범위의 테이블에없는 레코드 선택 SQL Server

표는 시작 날짜와 아래 끝 날짜가 : - 나는 날짜 스탬프가 위의 범위의에 존재하지 않는 다른 테이블에서 레코드를 선택해야

start_date     end_date 
=======================  ======================= 
2011-02-21 00:00:00.000  2011-02-25 00:00:00.000 
2011-04-18 00:00:00.000  2011-04-29 00:00:00.000 
2011-05-31 00:00:00.000  2011-06-03 00:00:00.000 
2011-07-21 00:00:00.000  2011-08-31 00:00:00.000 
2011-10-24 00:00:00.000  2011-10-28 00:00:00.000 
2011-12-19 00:00:00.000  2012-01-02 00:00:00.000 
2012-02-13 00:00:00.000  2012-02-17 00:00:00.000 
2012-04-02 00:00:00.000  2012-04-13 00:00:00.000 
2012-06-04 00:00:00.000  2012-06-08 00:00:00.000 
2012-07-20 00:00:00.000  2012-08-31 00:00:00.000 
2012-10-29 00:00:00.000  2012-11-02 00:00:00.000 
2012-12-24 00:00:00.000  2013-01-01 00:00:00.000 
2013-02-10 00:00:00.000  2013-02-16 00:00:00.000 
2013-03-24 00:00:00.000  2013-04-06 00:00:00.000 
2013-05-26 00:00:00.000  2013-06-01 00:00:00.000 
2013-07-24 00:00:00.000  2013-08-31 00:00:00.000 
2013-10-27 00:00:00.000  2013-11-02 00:00:00.000 

합니다.

위의 표에서 시작 날짜와 종료 날짜가 같을 수 있습니다. 이는 하루를 제외해야 함을 나타냅니다.

나의 초기 아이디어는 위의 범위에서 모든 날짜를 확장 한 다음 SELECT NOT INISISTS IN을 수행하거나이 목표를 달성하는보다 효율적인 방법이 있습니까?

+0

다른 테이블은 날짜 만 저장하거나 시간을 포함 할 수 있으며 이는 관련이 있습니다. 예를 들어, '02/02/2012 '를 시작과 끝으로 제외 표에서 비교할 수 있으며 '02/02/2012 12:00'의 값을 비교할 수 있습니다. 제출 된 답변의 대부분에서이 정보는 제외되지 않으므로 정보의 핵심 요소로 보입니다. – GarethD

+0

게시물 당 날짜 형식은 다음과 같습니다. 2012-12-24 00 : 00 : 00.000 모든 시간이 00 : 00 : 00.000 인 것처럼 보입니다. – JsonStatham

답변

1

범위 테이블을 사용하여 왼쪽 조인을 수행하고 일치 항목을 필터링하는 where 절을 추가 할 수 있습니다.

SELECT anothertable.* FROM anothertable 
LEFT JOIN range on anothertable.date >= range.start_date and anothertable.date <= range.end_date 
WHERE range.start_date IS NULL 
3
SELECT t.* 
FROM AnotherTable t 
WHERE NOT EXISTS(
    SELECT 1 
    FROM TblDate d 
    WHERE d.start_date <= t.DateColumn 
    AND d.end_date >= t.DateColumn 
) 

편집 : 그냥이 초기 아이디어 것을 알. 그래서 나는 그것이 가장 간단하고 빠른 접근이라고 가정합니다.

http://sqlserverperformance.idera.com/tsql-optimization/finding-nonexistent-records-hurry/

+0

이전 댓글에 대해 죄송합니다. 나는 "날짜 스탬프"를 "타임 스탬프"로 잘못 읽었습니다. –

1

은 아래의 (나는 생각한다)과 제안 같은 최종 결과보다 더 효율적입니다 : 다음은이 주제에 읽을 수있는 무언가이다. 제가 확신 할 수없는 유일한 것은, 시작일이 종료일과 같고 하루 종일 제외되는 귀하의 기준을 이해 한 경우입니다.

SELECT * 
FROM Table1 
     LEFT JOIN 
     ( SELECT Start_date, CASE WHEN End_Date = Start_Date THEN DATEADD(MILLISECOND, -1, DATEADD(DAY, 1, End_Date)) ELSE End_Date END [End_Date] 
      FROM table2 
     ) Exc 
      ON table.DateColumn BETWEEN Exc.Start_Date AND Exc.End_Date 
WHERE Exc.Start_Date IS NULL 
1

당신은이 조건을 확인해야합니다 1. 날짜 범위 2 날짜 사이에있는 동일한 시작일과 같은 날,하지만 나중에 종료일보다 하루에 (당신은 시간이없는 한 , 분과 초로 범위에서)

SELECT * FROM VALUE_TABLE 
LEFT JOIN DATE_RANGE_TABLE ON 
    YEAR(VALUE_TABLE.CHECK_DATE) = YEAR(start_date) 
    and MONTH (VALUE_TABLE.CHECK_DATE) = MONTH (start_date) 
    AND DAY (VALUE_TABLE.CHECK_DATE) = DAY (start_date) 
    OR VALUE_TABLE.CHECK_DATE BETWEEN start_date and end_date 
WHERE start_date IS NULL 
+3

@chris - 스택 오버 플로우에서'[sql-server]'태그가 Microsoft SQL Server에만 적용된다고 가정 할 수 있습니다. 짧은 요약을 보려면 태그 위로 마우스를 가져 가면됩니다. –