SQL Server DATEDIFF导致日比较溢出
有一个小问题,我得到了一个有几十万行的视图(并且只会以指数级的方式变大),其中一列的日期时间如下:SQL Server DATEDIFF导致日比较溢出,sql,sql-server,Sql,Sql Server,有一个小问题,我得到了一个有几十万行的视图(并且只会以指数级的方式变大),其中一列的日期时间如下:2017-07-10 12:13:46.000 我试图只选择在过去7天内带有时间戳的项目。我有这个: SELECT Top(100) * FROM vw_dataList WHERE DATEDIFF( DAY, vw_dataList.startTime, CURRENT_TIMESTAMP ) < 7; 从vw_数据列表中选择顶部(100)* 其中DATEDIFF(DAY,vw_data
2017-07-10 12:13:46.000
我试图只选择在过去7天内带有时间戳的项目。我有这个:
SELECT Top(100) * FROM vw_dataList
WHERE DATEDIFF( DAY, vw_dataList.startTime, CURRENT_TIMESTAMP ) < 7;
从vw_数据列表中选择顶部(100)*
其中DATEDIFF(DAY,vw_dataList.startTime,CURRENT_TIMESTAMP)<7;
但这会导致一个错误:
datediff函数导致溢出。分隔两个日期/时间实例的DatePart数量太多。尝试将datediff与不太精确的datepart一起使用
我不太清楚为什么会这样,因为即使DATEDIFF从时间戳创建了一个整数,它也不应该是如此大的整数以至于导致溢出,是吗?我真的不知道从这里到哪里去,所以任何建议都是非常感谢的
干杯 您的表中似乎有一个日期远远超过了过去或未来,导致
DATEDIFF
函数溢出。该函数返回一个有符号整数,因此未来或过去20亿(给定或获取)天的任何日期都将溢出
一种选择是根本不使用,而是使用当前时间减去7天,并使用该时间进行比较:
SELECT TOP(100) *
FROM vw_dataList
WHERE vw_dataList.startTime >= DATEADD(DAY, -7, CURRENT_TIMESTAMP)
一种可能的替代方法,尽管我不建议在这种情况下使用它,因为它返回一个
BIGINT
,如果您使用:
WHERE w_dataList.startTime > GETDATE() - 7
当您评论表的大小太大时,您还可以在此列中插入一个可能不会与DATEDIFF()函数一起使用的索引
索引样本:
CREATE INDEX ix_dataList ON vw_dataList (startTime DESC);
PS:它似乎是一个视图,因此您应该替换该视图以将其插入表中
PS2:检查你是否真的需要这个索引,您可以在执行计划中检查它。选择“仅今天”或“仅昨天”时,输出是什么?无论数字是什么都是一样的。如果您没有数字,那么日期就是当前的时间戳?您的日期是否明显远于过去/未来?如果您使用WHERE vw\u dataList.startTime>GETDATE()-7,当您评论表的大小太大时,您还可以在此列中插入一个可能不会与DATEDIFF()函数一起使用的索引。支持的整个日期范围仅为3652058天-这明显少于20亿天。@Compy,很高兴您找到了解决方案。如果我是你的话,我还是会先找出错误的原因。正如马丁·史密斯所观察到的,你根本不应该犯这个错误。