【问题标题】:Adding a value to a 'datetime' column caused an overflow向“日期时间”列添加值导致溢出
【发布时间】: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) 

工作正常。 (显然会)

有什么建议可能是错的吗?

【问题讨论】:

  • @RunningDateRiskValue 的值是多少? 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 itemthis answer。你可以试试DATEADD(MONTH, CASE WHEN y.RiskValue < 20000 THEN y.RiskValue END, @RunningDate)
  • 另请参阅this answerthis blog post

标签: sql-server-2012 dateadd


【解决方案1】:

张贴 Aaron Bertrand 的评论作为答案,以便遇到此问题的人会发现它很有帮助:

该行的 RiskValue 为 6,但您必须了解 SQL Server 可能不会按照您编写语句的相同顺序优化语句。尝试对应该被过滤器排除的值执行计算时,通常会出错,但首先尝试了计算。我们可以试试

DATEADD(MONTH, CASE WHEN y.RiskValue < 20000 THEN y.RiskValue END, @RunningDate)

另请阅读 thisthis 以更好地理解

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-20
    • 2012-03-13
    • 1970-01-01
    • 2019-07-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多