如何在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()取到上月最后一天,所有早于等于这个日期的数据都符合要求,逻辑更简洁直观。
查询优化建议
- 优先用日期范围对比:方式2没有对
dc.data字段使用函数,MySQL可以直接利用该字段上的索引(如果已创建),查询效率远高于对字段用函数的方式。 - 避免字段上的函数操作:如果用方式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高效。 - 确认字段类型:确保
dc.data是DATE或DATETIME类型,避免字符串转日期的隐式转换拖慢查询。
内容的提问来源于stack exchange,提问作者Vinícius Sodré Quadros
相关产品推荐
相关产品推荐

