【问题标题】:SQL Current month filters comparisonSQL当月过滤器比较
【发布时间】:2021-08-16 20:24:26
【问题描述】:

SQL中按当月过滤数据的方式有两种:

(DATEDIFF(MONTH, RecordDate, GETDATE())) = 0

RecordDate BETWEEN DATEADD(DAY, 1, EOMONTH(GETDATE(), -1)) and EOMONTH(GetDate()) 

他们之间有什么大的不同吗? 在我看来,会为每一行计算 DATEDIFF,所以这应该会严重影响性能,但在做了一些测试之后,在我看来它几乎等同于 secong 选项。

这两个过滤器是否有其他替代品?

【问题讨论】:

  • 第一种方法不是过滤。它只是计算一个值。 . .而在 SQL Server 中会产生错误。
  • 您使用的是哪个 dbms?所有这些功能都是特定于产品的。
  • @GordonLinoff 第一种方法是计算 datediff 并将其与 0 进行比较,因此这可能是一个过滤器

标签: sql performance date filter


【解决方案1】:

第二种方法会在两种情况下表现更好:

  • RecordDate 上有一个索引。
  • 该表使用RecordDate 作为分区键。

在更复杂的查询中,第二个版本也可能在更复杂的查询中帮助优化器。

如果没有索引,则查询需要进行全表扫描。这两个过滤操作非常相似(如您的测试所示)。

或者,如果表非常小,那么使用索引或分区可能不会成功。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多