MySQL:查询获取上个月的所有行

我需要select上个月创build的数据库中的所有行。

例如,如果当前月份是一月份,那么我想要返回在十二月份创build的所有行,如果该月份是二月份,那么我想返回在一月份创build的所有行。 我在我的数据库中有一个date_created列,列出以这种格式创build的date: 2007-06-05 14:50:17

 SELECT * FROM table WHERE YEAR(date_created) = YEAR(CURRENT_DATE - INTERVAL 1 MONTH) AND MONTH(date_created) = MONTH(CURRENT_DATE - INTERVAL 1 MONTH) 

这是另一个select。 假设你有一个索引的DATEDATETIMEtypes字段,这应该使用索引,因为格式化date将在使用索引之前进行types转换。 在使用EXPLAIN查看时,您应该看到range查询而不是index查询。

 SELECT * FROM table WHERE date_created >= DATE_FORMAT( CURRENT_DATE - INTERVAL 1 MONTH, '%Y/%m/01' ) AND date_created < DATE_FORMAT( CURRENT_DATE, '%Y/%m/01' ) 

如果没有未来的date…

 SELECT * FROM table_name WHERE date_created > (NOW() - INTERVAL 1 MONTH); 

testing。

或者hobodave的答案

 SELECT * FROM table WHERE YEAR(date_created) = YEAR(CURRENT_DATE - INTERVAL 1 MONTH) AND MONTH(date_created) = MONTH(CURRENT_DATE - INTERVAL 1 MONTH) 

你可以使用YEAR_MONTH作为单位来达到和EXTRACT一样的效果,所以你不需要AND,就像这样:

 SELECT * FROM table WHERE EXTRACT(YEAR_MONTH FROM date_created) = EXTRACT(YEAR_MONTH FROM CURDATE() - INTERVAL 1 MONTH) 

以下是查询获取上个月的logging:

 SELECT * FROM `tablename` WHERE `datefiled` BETWEEN DATE_SUB( DATE( NOW( ) ) , INTERVAL 1 MONTH ) AND LAST_DAY( DATE_SUB( DATE( NOW( ) ) , INTERVAL 1 MONTH ) ) 

问候 – saqib

select fields FROM table WHERE date_created LIKE concat(LEFT(DATE_SUB(NOW(), interval 1 month),7),'%');

如果您的date_created被索引,这个将能够利用索引,因为它不会将任何转换函数应用于字段值。

即使这个问题的答案已被选中,但是,我相信最简单的查询将是

 SELECT * FROM table WHERE date_created BETWEEN (CURRENT_DATE() - INTERVAL 1 MONTH) AND CURRENT_DATE(); 
 WHERE created_date >= DATE_ADD(LAST_DAY(DATE_SUB(NOW(), INTERVAL 2 MONTH)), INTERVAL 1 DAY) AND created_date <= DATE_ADD(LAST_DAY(DATE_SUB(NOW(), INTERVAL 1 MONTH)), INTERVAL 0 DAY) 

这对我有效(select上个月创build的所有logging,不pipe你在这个月运行查询的那一天)

select * FROM yourtable where DATE_FORMAT(date_created,'%Y-%m')= date_format(DATE_SUB(curdate(),INTERVAL 1 month),'%Y-%m')