【发布时间】:2015-05-16 10:47:06
【问题描述】:
我在 DML 语句中交叉应用了一个表值函数,它返回两列,其中一列是 RiskValue(它是一个表示扫描周期的整数) 现在,当我像这样打印值 RiskValue 和 dateadd 函数时(y 是函数别名,am 是另一个表)
select cast(y.RiskValue as int),dateadd(m,cast(y.RiskValue as int),@RunningDate)
from .....
它给了我正确的价值观
6 | 'Some Date'
但是当我在 where 子句中使用它作为
where am.DateOpen >= dateadd(m,cast(y.RiskValue as int),@RunningDate)
我得到错误:
向“日期时间”列添加值导致溢出
请注意,将硬编码值传递为
where am.DateOpen >= dateadd(m,6,@RunningDate)
工作正常。 (显然会)
有什么建议可能是错的吗?
【问题讨论】:
-
@RunningDate和RiskValue的值是多少?date类型在添加超出9999-12-31最大值的内容后会溢出,因此如果运行日期是 2015 年,您的风险值必须超过 95000 左右。可以吗?还有,RunningValue有什么类型? -
抱歉延迟响应。 @RunningDate 值范围从 2015-05-10 到 2015-05-16。 RiskValue 为 6,Runnning Value 为 DateTime 类型
-
鉴于这些值,我无法重新创建此错误,而且它应该不可能发生。您确定 RiskValue 列中没有很大的值吗?
-
RiskValue 是 6 对于该行,但您必须了解 SQL Server 可能不会按照您编写语句的顺序优化语句。尝试对应该被过滤器排除的值执行计算时,通常会出错,但计算是首先尝试的。请参阅 this Connect item 和 this answer。你可以试试
DATEADD(MONTH, CASE WHEN y.RiskValue < 20000 THEN y.RiskValue END, @RunningDate)。 -
另请参阅this answer 和this blog post。