在where子句中使用SQL日期差异

16

我正在执行以下查询:

SELECT
  *
FROM a
WHERE DATEDIFF(D, a.DateValue, DateTimeNow) < 3;

无法正常工作

我正在尝试获取不超过3天的数据。

SQL服务器。

如何做到这一点?

DATEDIFF速度太慢了。

3个回答

37

DateDiff 非常快... 你的问题在于你正在运行它在数据库表列值上,因此查询处理器必须在表中的每一行上运行该函数,即使该列上已经有索引。这意味着它必须从磁盘加载整个表。

相反,使用 dateAdd 函数在今天的日期上进行计算,并将数据库表列与该单个计算的结果进行比较。现在它只运行 DateAdd() 一次,并且可以使用索引(如果存在),以仅加载与谓词条件匹配的行。

Where a.DateValue > DateAdd(day,-3,getdate())

用这种方式做可以使你的查询谓词成为可搜索的


SARG-able,我之前没听说过。谢谢! - Daniel Williams
查询处理器必须在表中的每一行上运行该函数,这帮助我理解和解决了一个问题。在 WHERE 子句中,完全相同的 DATEDIFF 语句会报告溢出错误,但在 SELECT 中却不会。 - Pier-Luc Gendreau
我在使用带有DATEDIFF的where子查询时遇到了麻烦,让我感到非常困惑,但是您提供的解决方案非常好,真的帮了我很多。非常感谢您。 - FabianSilva
Where语句内部执行DateAdd函数和在外部将其赋值给变量,这样做是否有影响? - mbomb007
你的意思是在 SQL 查询语句内部还是在存储过程内部但在 SQL 语句之外创建一个变量? - Charles Bretana
显示剩余2条评论

1

0

您的查询似乎还不错。另一种解决方法是:

SELECT * FROM a WHERE a.DateValue > DATEADD(dd,-3,GETDATE())

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接