过去我一直使用:
WHERE DATEDIFF(m, [DATE_COL], GETDATE()) = 1
这让我获得了上个月发生的所有记录。例如,如果我运行此查询,它将获取一月份发生的所有记录。
但是,我目前正在使用一个更大的表,如果我使用上述查询,则加载它需要将近 30 分钟。但是,如果我使用类似
WHERE [SettlementDate] >= DateAdd(DAY, -31, GETDATE())
它通常会在 10 秒内运行。
我的问题是:
如何在不大幅增加处理时间的情况下获得与 WHERE DATEDIFF(m, [DATE_COL], GETDATE()) = 1
相同的结果?
谢谢!
最佳答案
您的查询速度很慢,因为当您执行 DATEDIFF(m, [DATE_COL], GETDATE())
时,它无法使用 [Date_Col]
上的任何索引。
无论如何,您都可以使用以下 where 子句,这将使用 [SettlementDate]
上的索引,希望它的性能比 DATEDIFF()
函数好得多。
WHERE [SettlementDate] >= DATEADD(MONTH, DATEDIFF(MONTH, 0, GETDATE())-1, 0)
AND [SettlementDate] < DATEADD(DAY,1,DATEADD(MONTH, DATEDIFF(MONTH, -1, GETDATE())-1, -1))
关于sql - 获取上个月所有记录的最佳方式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42169880/