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'