Mysql 选择上个月以后的所有行

Mysql 选择上个月以后的所有行,mysql,sql,Mysql,Sql,我正在尝试选择从上个月到未来所有月份的所有数据。。例如,我想在数据库中选择从1月到未来任何可用日期的所有内容,这适用于任何月份。。选择上一个月直到今年的未来月份 这是我的问题,它只从二月开始,我如何才能从上个月开始。。当前月份-1不工作 SELECT * FROM events WHERE YEAR(event_start_date) = YEAR(CURDATE()) AND MONTH(event_start_date) = MONTH(CURDATE()) 使用DATE\u S

我正在尝试选择从上个月到未来所有月份的所有数据。。例如,我想在数据库中选择从1月到未来任何可用日期的所有内容,这适用于任何月份。。选择上一个月直到今年的未来月份

这是我的问题,它只从二月开始,我如何才能从上个月开始。。当前月份-1不工作

SELECT * 
FROM events 
WHERE YEAR(event_start_date) = YEAR(CURDATE()) 
  AND MONTH(event_start_date) = MONTH(CURDATE())
使用
DATE\u SUB()
选择上一个月,使用
=
选择将来的所有数据:

SELECT * 
FROM events 
WHERE YEAR(event_start_date) = YEAR(CURDATE()) 
  AND MONTH(event_start_date) >= MONTH(DATE_SUB( CURDATE(), INTERVAL 1 MONTH))
尝试:

部分
DATE\u SUB(CURDATE(),间隔1个月)
将从当前日期减去一个月。如果您想要上个月和将来的一切,请使用:

AND MONTH(event_start_date) >= MONTH(DATE_SUB(CURDATE(), INTERVAL 1 MONTHS))
注意“>=”。尽管在一月份有一个边缘案件,你必须绕开它。最好的方法可能是这样:

WHERE event_start_date >= DATE_SUB(DATE_SUB(CURDATE(), INTERVAL 1 MONTHS), (DAYOFMONTH(CURDATE)) DAYS)
从上个月一号开始你就可以拿到所有的东西。没有边缘案例。

试试这个

SELECT * 
FROM events 
WHERE YEAR(event_start_date) = YEAR(CURDATE()) 
AND MONTH(event_start_date) >= MONTH(CURDATE() - INTERVAL 1 MONTH);

为了提高性能,您可能需要在
event\u start\u date
列上执行索引范围扫描操作。这意味着(很明显),您需要一个带有
事件开始日期
的索引作为前导列

要获得索引范围扫描,谓词需要位于裸
事件\u开始\u日期
列,而不是函数

WHERE event_start_date >= some_value
对于本例中的“some_value”,您可以使用一个可能的表达式:

CAST(DATE_FORMAT(NOW()+INTERVAL -1 MONTH ,'%Y-%m-01') AS DATE)

它取当前日期和时间,减去一个月,然后将日期和时间组件设置为每月第一天的午夜。

您的意思是在开始日期和结束日期之间?为了获得最佳性能,我们希望在裸
事件\u开始日期
列中使用谓词;这将允许索引范围扫描(如果有合适的索引可用),而不是让MySQL计算表中的每一行。“诀窍”是想出一个使用当前日期时间并返回上个月第一天的表达式,例如
event\u start\u date>=date\u格式(NOW()+INTERVAL-1 month,%Y-%m-01')
,因为他只选择了一个特定的年份,所以edge case不会是一个问题。如果他想得到去年的最后一个月,这确实是一个重要的边缘案例。在这种情况下,
YEAR(event\u start\u date)=YEAR(CURDATE())
不允许他从去年选择任何内容。
date\u SUB(CURDATE(),INTERVAL 1 month(DAYOFMONTH(CURDATE)-1)天)
有语法错误。谢谢,我想你不能使用两个INTERVAL
WHERE event_start_date >= some_value
CAST(DATE_FORMAT(NOW()+INTERVAL -1 MONTH ,'%Y-%m-01') AS DATE)