Sql 正在检查溢出的日期时间值
我有一个SQL查询来检查DateTime值高于“9999-12-31”时是否存在溢出。但它仍然在运行时抛出一些溢出异常。我做错了什么 代码 例外情况Sql 正在检查溢出的日期时间值,sql,sql-server,Sql,Sql Server,我有一个SQL查询来检查DateTime值高于“9999-12-31”时是否存在溢出。但它仍然在运行时抛出一些溢出异常。我做错了什么 代码 例外情况 向“datetime”列添加值会导致溢出。您的案例陈述显然是将si.IssueDate添加了太多天,结果大于9999年12月31日 将代码编辑为如下内容:- SELECT CASE WHEN datediff(d,si.IssueDate,'9999-12-31')<s.ClaimDelay THEN si.issuedate
向“datetime”列添加值会导致溢出。您的案例陈述显然是将si.IssueDate添加了太多天,结果大于9999年12月31日 将代码编辑为如下内容:-
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
您可以检查从最大日期减去的日期是否小于您拥有的日期,而不是检查添加到日期是否是溢出
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 */
我会将代码移到业务层中。存储过程不是执行此操作的地方
但是,如果确实希望它出现在存储过程中,请在选择之前检查值。你是如何得到一年>9999的?此SELECT语句之前存在数据问题或逻辑问题。溢出异常可能在Dateadd期间发生。您需要在执行Dateadd之前进行检查。此外,如果您运行的系统需要接近9998-12-31的数据。。。你可能设计错了是的。。这就是为什么我要检查结果datetime是否超过9999-12-31。在包含您的代码后,我仍然只收到相同的异常消息。@Deva答案有一个拼写错误。>必须是一个很好的解决方案。这就是我要找的。谢谢斯蒂金和卢夫。@斯蒂金我感谢你们的帮助。
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 */