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

如何在MySQL中筛选仅已结束月份(Apache Superset环境)

解决MySQL中筛选已结束月份的问题(含优化方案)

问题修正

你原来的语句只对比了月份、未考虑年份,才会误过滤掉往年1-10月的数据。要实现「当年仅保留上月底及之前的数据,往年全部保留」,可以用两种方式编写WHERE条件:

方式1:基于年份+月份的逻辑判断

WHERE 
  EXTRACT(YEAR FROM dc.data) < EXTRACT(YEAR FROM CURDATE())
  OR (
    EXTRACT(YEAR FROM dc.data) = EXTRACT(YEAR FROM CURDATE())
    AND EXTRACT(MONTH FROM dc.data) < EXTRACT(MONTH FROM CURDATE())
  )

这个逻辑先匹配所有往年的数据,再匹配当年月份早于当前月份的数据,完全覆盖你的需求。

方式2:直接对比日期到上月末(推荐)

WHERE dc.data <= LAST_DAY(CURDATE() - INTERVAL 1 MONTH)

CURDATE() - INTERVAL 1 MONTH会得到上月的当前日期,再用LAST_DAY()取到上月最后一天,所有早于等于这个日期的数据都符合要求,逻辑更简洁直观。

查询优化建议

  1. 优先用日期范围对比:方式2没有对dc.data字段使用函数,MySQL可以直接利用该字段上的索引(如果已创建),查询效率远高于对字段用函数的方式。
  2. 避免字段上的函数操作:如果用方式1,EXTRACT(YEAR FROM dc.data)这类操作会让MySQL无法使用常规索引,除非你给该字段创建函数索引(比如CREATE INDEX idx_data_year_month ON 表名 (EXTRACT(YEAR FROM dc.data), EXTRACT(MONTH FROM dc.data));),但还是不如方式2高效。
  3. 确认字段类型:确保dc.data是DATE或DATETIME类型,避免字符串转日期的隐式转换拖慢查询。

内容的提问来源于stack exchange,提问作者Vinícius Sodré Quadros

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 00:01:01