检查溢出日期时间值

时间:2013-09-17 12:51:31

标签: sql sql-server

我有一个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

异常

向'datetime'列添加值会导致溢出。

3 个答案:

答案 0 :(得分: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

答案 1 :(得分: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 */

答案 2 :(得分:0)

我会将该代码移到业务层中。存储过程不是执行此操作的地方。

但是,如果您确实在存储过程中需要它,请检查选择之前的值。你怎么得到一年&gt; 9999?在SELECT语句之前,您遇到数据问题或逻辑问题。