2014-09-08 5 views
0

[SQL Server 2008 SP3 실행]SQL Server : 작업 순서를 따르지 않습니까?

쿼리 결과가 smalldatetime 형식의 오버플로가 발생했습니다. 그러나 이것은 (이론적으로) 쿼리가 구조화 된 방식으로 인해 결코 발생하지 않아야합니다. 로직은 오버 플로우를 야기하는 DATEADD()이 실행되기 훨씬 전에 진리 값을 알 수있게해야합니다. - 오드리의 (a smalldatetime은) 다음은 smalldatetime으로 공간을 오버플로,> = 2014년 10월 1일 인 경우를 제외하고

TimeIn >= '1/8/1950' AND TimeIn < '1/9/1950' AND 
DATEADD(week, DATEDIFF(week, '1/8/1950', '9/14/2014'), TimeIn) >= '9/14/2014' 

이 잘 작동 :

다음은 WHERE 절의 관련 부분이다. 그런데 DATEADD()이 실행되는 이유는 무엇입니까? 날짜가 10/1/14 인 경우 이 실행되지 않아야합니다 ...하지만 그렇습니다.

답변

3

WHERE 기준의 일부는 정의 된 순서대로 실행되지 않으므로 DATEADD()이 실행되지 않습니다. 이는 SQL Server의 작동 방식이 아닙니다.

TimeIn >= '1/8/1950' AND TimeIn < '1/9/1950' 
AND CASE WHEN TimeIn >= '1950-01-08' AND TimeIn < '1950-01-09' 
     THEN DATEADD(week, DATEDIFF(week, '1/8/1950', '9/14/2014'), TimeIn) 
    END >= '2014-09-14' 
+0

내가 그 두려워 :이 약

내가 하드 코딩 문제가 날짜 쿼리를 실행할 때 실제로 오류가 표시되지 않습니다,하지만 한 가지 방법은 CASE 표현을 사용하는 것입니다. 이것에 대한 (n 우아한) 방법에 대한 제안? – Conrad

+0

실제로 문제가 무엇인지 모르겠다. 날짜가 '10/1/2014 '이후이지만 다음 명령이 잘 실행되는 것 같다고했다.'SELECT DATEADD (week, DATEDIFF (week, '1/8/1950 ', '2014 년 9 월 14 일)', '10/2/2014 ')' –

+0

각 표현식 부분을 괄호로 묶어서 SQL에서 바로 가기를 시도 할 수는 있지만 옵티 마이저의 보장 방법은 없습니다 쿼리를 평가할 것입니다. – Sparky