Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 正在检查溢出的日期时间值_Sql_Sql Server - Fatal编程技术网

Sql 正在检查溢出的日期时间值

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

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