SQL Server执行DATEADD(d, -100000, GETDATE())触发datetime溢出错误求助
你触发的报错中文翻译如下:
SQL错误:517 22007 [Microsoft][SQL Server Native Client 11.0][SQL Server] 向“datetime”列添加值导致溢出
问题根因
该报错和服务器iLo硬件无直接关联,核心触发逻辑是SQL Server的datetime数据类型仅支持 1753-01-01 至 9999-12-31 的日期范围:
- 你当前使用的查询语句中调用
DATEADD(d, -100000, GETDATE()),按当前日期计算,减去10万天(约274年)得到的日期早于1753年,超出datetime类型合法范围,触发溢出。 - 无iLo的Gen2服务器可正常运行的常见原因有两类:要么该服务器上
Ents表的LastActive字段类型为支持更早日期的datetime2,要么数据库兼容级别设置允许非法日期自动截断不抛出错误。
修复方案
你可任选以下一种方案修改查询语句即可解决问题,操作仅需要你执行SQL更新:
方案1:调整日期偏移量(推荐,适配现有字段类型)
将100000天的偏移量调整为60000天(约164年,计算后日期不会早于1753年),修改后的语句如下:
select dbo.ents.containerId From dbo.Ents Where LastActive > DATEADD(d, -60000, GETDATE ());
方案2:强制使用datetime2计算(适配大偏移量需求)
如果业务确实需要查询近270年以上的历史数据,将计算逻辑转换为datetime2类型即可避免溢出:
select dbo.ents.containerId From dbo.Ents Where LastActive > DATEADD(d, -100000, CAST(GETDATE() AS datetime2));
差异验证(可选)
如果需要确认两台服务器的配置差异,可执行以下语句查询字段类型:
SELECT DATA_TYPE FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = 'Ents' AND COLUMN_NAME = 'LastActive';
如果Gen6服务器返回结果为datetime,Gen2服务器返回结果为datetime2,即可完全验证根因判断。
内容的提问来源于stack exchange,提问作者TheDarkNoise
相关产品推荐
相关产品推荐

