DATEADD条件在SQL Server 2008中需要很长时间。为什么?

时间:2015-11-21 04:27:21

标签: sql sql-server sql-server-2008

我想在我的销售表中获取上个月和当月之间的数据。我使用dateadd函数获得月份。但查询需要很长时间才能返回结果。当我删除where子句中的日期范围时,执行时间非常快。如何在查询中将月份的日期范围添加到快速执行时间?

这是我的查询。

select *
from sales S
where S.DOCUMENT_DATE >= DATEADD(m, DATEDIFF(m, 0, GETDATE())-1 , 0) and  
      S.DOCUMENT_DATE <= DATEADD(m, DATEDIFF(m, 0, GETDATE())+1 , -1)   

2 个答案:

答案 0 :(得分:0)

根据您的查询,您需要sales(document_date)上的索引。

答案 1 :(得分:0)

您可以创建非聚集索引。

CREATE NONCLUSTERED INDEX NC_IX_Sales_DOCUMENT_DATE ON Sales (DOCUMENT_DATE)

然后你可以运行你的查询。

SELECT *
FROM Sales s
WHERE s.DOCUMENT_DATE >= DATEADD(mm,DATEDIFF(mm,0,DATEADD(mm,-1,GETDATE())),0)
  AND s.DOCUMENT_DATE <= DATEADD(ms,-3,DATEADD(mm,DATEDIFF(m,0,getdate())+1, 0))

此外,您可以考虑当前月份尚未结束。

SELECT *
FROM Sales s
WHERE s.DOCUMENT_DATE >= DATEADD(month,DATEDIFF(month,0,DATEADD(month,-1,GETDATE())),0)
  AND s.DOCUMENT_DATE <= GETDATE()