[运行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,那么 永远不会被执行......但它是。
答案 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'