【发布时间】:2011-07-13 02:31:27
【问题描述】:
我正在做如下查询:
SELECT
*
FROM a
WHERE DATEDIFF(D, a.DateValue, DateTimeNow) < 3;
不工作
我正在尝试获取不超过 3 天的数据。
SQL 服务器。
如何做到这一点?
DATEDIFF 工作太慢..
【问题讨论】:
标签: sql sql-server datetime projection
我正在做如下查询:
SELECT
*
FROM a
WHERE DATEDIFF(D, a.DateValue, DateTimeNow) < 3;
不工作
我正在尝试获取不超过 3 天的数据。
SQL 服务器。
如何做到这一点?
DATEDIFF 工作太慢..
【问题讨论】:
标签: sql sql-server datetime projection
DateDiff 非常快...您的问题是您在数据库表列值上运行它,因此查询处理器必须在表中的每一行上运行该函数,即使该列上有索引.这意味着它必须从磁盘加载整个表。
改为在今天使用dateAdd 函数,并将数据库表列与单次计算的结果进行比较。现在它只运行DateAdd() 一次,并且它可以使用索引(如果存在),只加载与谓词条件匹配的行。
Where a.DateValue > DateAdd(day,-3,getdate())
这样做会使您的查询谓词SARG-able
【讨论】:
the query processor must run the function on every row in the table 帮助我理解并解决了我遇到的问题,即完全相同的 DATEDIFF 语句会抱怨 WHERE 子句中的溢出但在 SELECT 中没有。
Where 中执行DateAdd 或将其分配给外部变量是否重要?
http://msdn.microsoft.com/en-us/library/aa258269%28v=sql.80%29.aspx 上的 Microsoft 文档建议您应该使用 getdate() 而不是 DateTimeNow。这样会更好吗?
【讨论】:
您的查询似乎不错。另一种解决方法是:
SELECT * FROM a WHERE a.DateValue > DATEADD(dd,-3,GETDATE())
【讨论】: