Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/24.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 Server DATEDIFF导致日比较溢出_Sql_Sql Server - Fatal编程技术网

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,很高兴您找到了解决方案。如果我是你的话,我还是会先找出错误的原因。正如马丁·史密斯所观察到的,你根本不应该犯这个错误。