You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.29 05:10:08