Firebird SQL优化:如何快速获取年初至今(排除当月)的日期数据
优化年初至今(不含当前月)日期查询的方法
首先你的原查询有两个关键问题:
- 条件写错了:
EXTRACT(MONTH FROM (MYDATE))<EXTRACT(MONTH FROM (MYDATE))这部分永远不成立,应该改成和当前月份比较,也就是EXTRACT(MONTH FROM MYDATE) < EXTRACT(MONTH FROM CURRENT_DATE) - 性能瓶颈核心:你在
MYDATE字段上调用了EXTRACT函数,这会让数据库无法使用该字段上的索引(如果存在的话),只能做全表扫描,速度自然慢。
下面是几种高效的写法,核心思路是避免在查询字段上用函数,改用范围匹配,让索引能发挥作用:
通用SQL写法(适用于PostgreSQL、SQL Server等支持DATE_TRUNC的数据库)
SELECT MYDATE FROM TB WHERE MYDATE >= DATE_TRUNC('year', CURRENT_DATE) AND MYDATE < DATE_TRUNC('month', CURRENT_DATE)
DATE_TRUNC('year', CURRENT_DATE)会返回当年1月1日0点,DATE_TRUNC('month', CURRENT_DATE)返回当前月1日0点,这样的范围查询可以直接命中MYDATE上的索引,大幅提升速度。
MySQL专属写法
MySQL没有DATE_TRUNC,可以用DATE_FORMAT代替:
SELECT MYDATE FROM TB WHERE MYDATE >= DATE_FORMAT(CURRENT_DATE, '%Y-01-01') AND MYDATE < DATE_FORMAT(CURRENT_DATE, '%Y-%m-01')
Oracle专属写法
Oracle用TRUNC函数来截断日期:
SELECT MYDATE FROM TB WHERE MYDATE >= TRUNC(SYSDATE, 'YEAR') AND MYDATE < TRUNC(SYSDATE, 'MONTH')
额外优化建议
如果TB表的MYDATE字段还没建索引,赶紧创建一个:
CREATE INDEX idx_tb_mydate ON TB(MYDATE);
内容的提问来源于stack exchange,提问作者Jonathan Livingston Seagull
相关产品推荐
相关产品推荐

