SQL子句在where子句中的区别

时间:2011-03-10 22:22:27

标签: sql sql-server datetime projection

我正在进行如下查询:

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

并且无法正常工作

我试图获取不超过3天的数据。

SQL server。

怎么做?

DATEDIFF工作太慢..

3 个答案:

答案 0 :(得分:27)

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

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

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

以这种方式执行此操作会使您的查询谓词SARG-able

答案 1 :(得分:1)

微软在http://msdn.microsoft.com/en-us/library/aa258269%28v=sql.80%29.aspx上的文档表明,DateTimeNow应该getdate()而不是{{1}}。这样做有用吗?

答案 2 :(得分:0)

您的查询似乎并不糟糕。另一种解决方法是:

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