SQL Server:未遵循操作顺序?

时间:2014-09-08 19:16:01

标签: sql sql-server-2008 smalldatetime

[运行SQL Server 2008 SP3]

我有一个查询导致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)>&gt; = 10/1/2014,否则它将溢出smalldatetime空间。但为什么DATEADD()会被执行?如果日期是10/1/14,那么 永远不会被执行......但它是。

1 个答案:

答案 0 :(得分:3)

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'