sql - 获取上个月所有记录的最佳方式

标签 sql sql-server datediff

过去我一直使用:

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/

相关文章:

c# - 加速插入 - 一次插入列表

sql - 您是否应该避免在 JOIN 的 ON 语句中混合列和参数比较?

c# - LinqToSQL 设计查询/担忧

SQL Server LAG() 函数计算行之间的差异

mysql - MySQL 中的最大值 (x,y)

sql - 案例声明中的案例

c# - 如何检查我的数据库中是否已存在一个值并显示验证消息

mysql - sql 将列添加到结果中

sql-server - DateDiff 函数 SQL Server

php - 用户输入的开始日期和到期日期之间的倒计时