我有一个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'列添加值会导致溢出。
答案 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语句之前,您遇到数据问题或逻辑问题。