SQL Server: порядок операций не выполняется?

[Запуск SQL Server 2008 с пакетом обновления 3]

У меня есть запрос, который приводит к переполнению smalldatetime тип. Однако, это (в теории) никогда не должно происходить из-за того, как я структурировал запрос - логика должна заставить значение истинности быть известным задолго до того, как DATEADD() выполняется, что вызывает переполнение.

Вот соответствующая часть предложения WHERE:

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

Это прекрасно работает - за исключением случаев, когда TimeIn (smalldatetime) is >= 1.10.2014, тогда он переполнит пространство smalldatetime. Но почему DATEADD() даже казнить? если дата 1.10.14, она никогда не должна выполняться... но это так.

1 ответ

Решение

Части WHERE критерии не выполняются в определенном порядке, который мешает DATEADD() от выполнения, это просто не так, как работает SQL Server.

На самом деле я не вижу ошибки, когда я запускаю ваш запрос с жестко заданной датой, но одним из способов будет использование CASE выражение:

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'
Другие вопросы по тегам