0

[运行 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 (a smalldatetime) >= 10/1/2014,否则它将溢出 smalldatetime 空间。但为什么DATEADD()还要被处决呢?如果日期是 2014 年 10 月 1 日,它永远不应该被执行......但它是。

4

1 回答 1

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'
于 2014-09-08T19:17:57.743 回答