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
我没有访问带有分析器的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中受益.
| 归档时间: |
|
| 查看次数: |
12653 次 |
| 最近记录: |