SQL - 适用于当月的"where"子句

yos*_*osh 1 sql t-sql sql-server datetime

从SQL Server当前月份检查事件的正确方法是什么?为什么?

1) WHERE (DATEDIFF(month, EventTime, GETDATE())=0))

2) WHERE (YEAR(EventTime) = YEAR(GETDATE()) AND MONTH(EventTime) = MONTH(GETDATE()))

表中的日期格式是ie EventTime: 2011-11-30 15:68:25.000

Mat*_*lie 7

我没有访问带有分析器的SQL Server,所以我实际上无法提供尽可能详细的答案.

问题基本上是关于哪一个允许最少计算和最有效地使用索引.

使用字符串操作的变体具有最高的计算负载,并且根本不使用索引.所以我会跳过那些.留下四个常见的表达方式......

SELECT * FROM date_sargable
WHERE  YEAR(value) = YEAR (getDate())
  AND MONTH(value) = MONTH(getDate())
;

SELECT * FROM date_sargable
WHERE DATEDIFF(MONTH, value, getDate()) = 0
;

SELECT * FROM date_sargable
WHERE DATEDIFF(MONTH, 0, value) = DATEDIFF(MONTH, 0, getDate())
;


SELECT * FROM date_sargable
WHERE value >= DATEADD(MONTH, DATEDIFF(MONTH, 0, getDate())    , 0)
  AND value <  DATEADD(MONTH, DATEDIFF(MONTH, 0, getDate()) + 1, 0)
;
Run Code Online (Sandbox Code Playgroud)

前三个使用INDEX SCAN,但最后一个使用INDEX SEEK.不同之处在于查询的格式允许优化器知道您需要特定范围的数据,它在索引的一个块中彼此相邻,并且很容易找到该块.

如果在查看执行计划时,您在一个版本中看到SEEK,在另一个版本中看到SCAN,那么您更有可能从SEEK中受益.