2012-03-14 2 views
0

SQL Server2005에서 2 개의 날짜 필드가 비교되는 쿼리가 있습니다. 내가 시간을 포함시키지 않고 비교를 위해 날짜 부분 만 사용한다면 질의는 빠르게 (밀리 초 단위로) 실행됩니다. 그러나 날짜 부분과 함께 시간을 비교해야합니다. 시간 부분을 포함 시키면 쿼리가 매우 느리게 실행되고 마지막으로 연결 시간 초과 오류가 반환됩니다.SQL 서버 날짜/시간 비교를 실행하는 데 시간이 걸림

`((startdate1 >= @startdate2 and enddate1 <= @enddate2) or 
(startdate1 <= @startdate2 and enddate1 >= @startdate2 and enddate1 <= @enddate2) or 
(startdate1 >= @startdate2 and startdate1 < @enddate2 and enddate1 > @enddate2) or 
(startdate1 < @startdate2 and enddate1 > @enddate2))` 

이 부분은 쿼리를 실행하는 데 많은 시간이 걸립니다. 그러나 쿼리를 아래 형식으로 변경하면 쿼리가 매우 빠르게 실행됩니다.

((cast(CONVERT(VARCHAR(10),startdate1,101) as datetime) >= cast(CONVERT(VARCHAR(10),@startdate2,101) as datetime)  
AND cast(CONVERT(VARCHAR(10),enddate1,101) as datetime)<= cast(CONVERT(VARCHAR(10),@enddate2,101) as datetime)) OR  

(cast(CONVERT(VARCHAR(10),startdate1,101) as datetime) <= cast(CONVERT(VARCHAR(10),@startdate2,101) as datetime)  
AND ((cast(CONVERT(VARCHAR(10),enddate1,101) as datetime) >= cast(CONVERT(VARCHAR(10),@startdate2,101) as datetime))  
AND (cast(CONVERT(VARCHAR(10),enddate1,101) as datetime) <= cast(CONVERT(VARCHAR(10),@enddate2,101) as datetime) ))) OR 

(cast(CONVERT(VARCHAR(10),startdate1,101) as datetime) >= cast(CONVERT(VARCHAR(10),@startdate2,101) as datetime) and  
((cast(CONVERT(VARCHAR(10),startdate1,101) as datetime) < cast(CONVERT(VARCHAR(10),@enddate2,101) as datetime)) AND  
(cast(CONVERT(VARCHAR(10),enddate1,101) as datetime) > cast(CONVERT(VARCHAR(10),@enddate2,101) as datetime) ))) OR  

(cast(CONVERT(VARCHAR(10),startdate1,101) as datetime) < cast(CONVERT(VARCHAR(10),@startdate2,101) as datetime) and  
cast(CONVERT(VARCHAR(10),enddate1,101) as datetime) > cast(CONVERT(VARCHAR(10),@enddate2,101) as datetime))) 

제발 나에게 제안 해주세요. 미리 감사드립니다 ...

+0

그건 ... 말이되지 않습니다. 열에 대한 이러한 모든 변환은 잠재적 인 인덱스 사용을 제외해야하지만 첫 번째 쿼리는 인덱스를 사용할 수 있어야합니다 (존재하는 경우). 이 열에 유용한 인덱스가 있습니까? –

+0

첫 번째 사례에 대해 잘못된 쿼리 계획이 캐시 되었습니까? 'fullscan으로 yourtable에서 통계 업데이트'를 실행하십시오 (캐시를 플러시하고 통계를 재 계산해야 함). 다시 시도하십시오. – Arvo

+0

'fullscan으로 yourtable에서 통계 업데이트'를 실행하는 방법 – ASD

답변

0

DateDiff 기능을 사용해 보셨습니까?

+0

예. 시도했습니다.이 또한 실행 시간이 필요합니다. 코드 스 니펫은 다음과 같습니다. ((datediff (mm, @ startdate2, startdate1)> = 0 및 datediff (mm, @ enddate2, enddate1) <= 0) 또는 (datediff (mm, @ startdate2, startdate1) <= 0 및 datediff 0, datediff (mm, @ enddate2, enddate1) <= 0) 또는 (datediff (mm, @ startdate2, startdate1)> = 0 및 datediff (mm, @ enddate2, startdate1) 0 및 datediff (mm, @ enddate2, enddate1)> 0) 또는 (datediff (mm, @ startdate2, startdate1) <0 및 datediff (mm, @ enddate2, enddate1)> 0)) – ASD

+0

실행 시간이 20 분 이상입니다. 테이블에있는 단 10 개의 레코드에 대해서 – ASD

+0

이것은 이해가되지 않습니다. 이러한 변수를 정의한 유형은 무엇입니까? 더 많은 코드를 프로 시저에 붙여 넣을 수 있습니까? –

관련 문제