3

我有一个 SQL 查询来检查 DateTime 值(高于“9999-12-31”)中的溢出。但是它在运行时仍然会引发一些溢出异常。我究竟做错了什么?

代码

SELECT CASE
       WHEN Dateadd(d,s.ClaimDelay,si.IssueDate) NOT IN (9999-12-31) THEN si.issuedate
       ELSE Dateadd(d,s.ClaimDelay,si.IssueDate)
   END
FROM SubscriptionIssues si
LEFT OUTER JOIN Subscriptions s ON s.Id=si.SubId

例外

向“日期时间”列添加值导致溢出。

4

3 回答 3

2

您的案例陈述显然是增加了这么多天si.IssueDate,结果大于Dec 31, 9999

将您的代码编辑为如下内容:-

SELECT CASE
       WHEN datediff(d,si.IssueDate,'9999-12-31')<s.ClaimDelay THEN si.issuedate
       ELSE Dateadd(d,s.ClaimDelay,si.IssueDate)
   END
FROM SubscriptionIssues si
LEFT OUTER JOIN Subscriptions s ON s.Id=si.SubId
于 2013-09-17T13:00:12.930 回答
1

您可以检查从最大日期中减去是否小于您拥有的日期,而不是检查添加到日期是否溢出。

declare @date date

set @date = '9995-01-01'

select
    case
        when dateadd(d, -1000, '9999-12-31') < @date then @date
        else dateadd(d, 1000, @date)
end
/* returns 9997-09-27 */

set @date = '9999-01-01'

select
    case
        when dateadd(d, -1000, '9999-12-31') < @date then @date
        else dateadd(d, 1000, @date)
end

/* returns 9999-01-01 */
于 2013-09-17T13:00:59.573 回答
0

我会将该代码移到业务层中。存储过程不是这样做的地方。

但是,如果您真的希望在存储过程中使用它,请在选择之前检查值。你怎么得到一年> 9999?在此 SELECT 语句之前有数据问题或逻辑问题。

于 2013-09-17T13:49:44.673 回答