从上个月开始选择所有行

时间:2014-02-14 22:37:09

标签: mysql sql

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

这是我的QUERY,它只从2月份开始,我怎样才能从上个月开始..当前月份 - 1不起作用

SELECT * 
FROM events 
WHERE YEAR(event_start_date) = YEAR(CURDATE()) 
  AND MONTH(event_start_date) = MONTH(CURDATE())

5 个答案:

答案 0 :(得分:0)

使用DATE_SUB()选择上个月,>=选择以后的所有数据:

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

答案 1 :(得分:0)

尝试:

AND MONTH(event_start_date) = MONTH(DATE_SUB(CURDATE(), INTERVAL 1 MONTHS))

部分DATE_SUB(CURDATE(), INTERVAL 1 MONTH)将从当前日期减去一个月。如果您想要上个月以及将来的所有内容,请使用:

AND MONTH(event_start_date) >= MONTH(DATE_SUB(CURDATE(), INTERVAL 1 MONTHS))

注意'> ='。虽然1月份有一个边缘案例,但你必须到处走走。最好的方法可能是这样的:

WHERE event_start_date >= DATE_SUB(DATE_SUB(CURDATE(), INTERVAL 1 MONTHS), (DAYOFMONTH(CURDATE)) DAYS)

从上个月1日起,这将为您提供一切。没有边缘案例。

答案 2 :(得分:0)

试试这个

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

答案 3 :(得分:0)

SELECT * 
FROM events 
WHERE event_start_date >= '1/'+MONTH(DATE_SUB( CURDATE(), INTERVAL 1 MONTH))+'/'+YEAR(DATE_SUB( CURDATE(), INTERVAL 1 MONTH))

答案 4 :(得分:0)

对于性能,您可能希望在event_start_date列上进行索引范围扫描操作。这意味着(显然),您需要一个以event_start_date作为前导列的索引。

要获得索引范围扫描,谓词需要位于裸event_start_date列,而不是函数。

WHERE event_start_date >= some_value

对于这种情况下的“some_value”,您可以使用的一个可能的表达式是:

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

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

相关问题