mysql 如何在SQL查询中只过滤已完成月份

xzlaal3s  于 2022-11-21  发布在  Mysql
关注(0)|答案(3)|浏览(153)

我希望仅使用关闭月份过滤我的查询,因此今天(17/11/2022)将仅返回31/10/2022及之前的日期。我尝试了以下方法:

WHERE EXTRACT(MONTH FROM dc.data) <= (EXTRACT(MONTH FROM CURDATE()) - 1)

所以我得到当前日期,提取月份并减去1,然后过滤〈=该月份,对吗?dc.data
但问题是,它也在过滤过去年份中的1-10个月,该过滤器应仅应用于当前年份,而仍显示过去年份中的所有月份,我如何才能做到这一点?
这个查询是在Apache Superset SQL编辑器上编写的,所以我认为我对函数有一些限制...数据库是MySQL(已编辑)
PS:我还想知道是否有一种方法可以优化这个查询,不确定这是否是一个处理日期的好方法

piwo6bdm

piwo6bdm1#

如果你想要实际年份,你还需要比较年份

WHERE (EXTRACT(YEAR FROM dc.data) = EXTRACT(YEAR FROM CURDATE()) 
      AMD EXTRACT(MONTH FROM dc.data) <= (EXTRACT(MONTH FROM CURDATE()) - 1)) OR EXTRACT(YEAR FROM dc.data) < EXTRACT(YEAR FROM CURDATE())

或者使用前一个月的最后一天来获取最后一天

WHERE dc.data <= (date_trunc('MONTH', now()) + INTERVAL '1 MONTH - 1 day')::date;

您应该对数据使用INDEX以更快地获取数据

aamkag61

aamkag612#

Postgres提供了一个修道院函数date_trunc(参见文档)。其中一个选项是截断到month,它将返回参数的第一天。因此

where dc.data < date_trunc('month', current_date)
liwlm1x9

liwlm1x93#

TRUNC/DATE_TRUNC的MySQL等效项为

DATE_FORMAT(CURDATE(), '%Y-%m-01')

所以我的最终结果是

WHERE dc.data < DATE_FORMAT(CURDATE(), '%Y-%m-01')

相关问题