SQL SSMS中GETDATE()-x的最大x值及DATEADD回溯范围问询
SQL中GETDATE()-x与DATEADD(year,-x,GETDATE())的时间范围及失败阈值
1. GETDATE()-x的回溯上限与失败条件
在SQL Server中,GETDATE()返回datetime类型值,该类型合法时间范围是1753-01-01 00:00:00到9999-12-31 23:59:59.997。
执行GETDATE()-x时,x默认按天数计算(datetime类型与整数相减逻辑为减去对应天数),因此它能回溯的最远时间就是datetime类型的最小值1753-01-01,对应的x等于当前日期到1753-01-01的总天数差。
一旦x超过这个天数差,计算出的时间会小于1753-01-01,查询会直接抛出“日期时间值超出范围”类错误。
2. DATEADD(year,-x,GETDATE())的范围对比
DATEADD(year,-x,GETDATE())直接按年份做减法运算,它的回溯范围同样受限于GETDATE()返回值的数据类型:
- 若为datetime类型,它能回溯的最远时间同样是
1753-01-01,和GETDATE()-x的下限一致。当x大到让计算结果早于1753-01-01时,同样触发报错。 - 若使用datetime2类型(范围
0001-01-01到9999-12-31),两种方式的回溯上限会更早,x可取值也更大,但默认GETDATE()返回的是datetime类型。
3. 触发失败的x阈值
- 对于
GETDATE()-x:x的最大值为DATEDIFF(day, '1753-01-01', GETDATE()),超过这个值就会报错。以2024年为例,这个值约为99000(精确值需按实际日期计算总天数)。 - 对于
DATEADD(year,-x,GETDATE()):x的最大值为DATEDIFF(year, '1753-01-01', GETDATE())。比如当前是2024年,x最大为271(2024-1753),若取272,计算结果会早于1753年,触发报错。
内容的提问来源于stack exchange,提问作者Prez7112
相关产品推荐
相关产品推荐

