关于mysql:查询以获取上个月的所有行

Query to get all rows from previous month

我需要选择数据库中上个月创建的所有行。

例如,如果当前月份是一月,那么我想返回在十二月创建的所有行,如果月份是二月,那么我想返回在一月份创建的所有行。 我的数据库中有一个date_created列,它以以下格式列出了创建的日期:2007-06-05 14:50:17


1
2
3


这是另一种选择。假设您有索引的DATEDATETIME类型字段,则应使用索引,因为格式化的日期将在使用索引之前进行类型转换。使用EXPLAIN查看时,应该会看到一个range查询而不是一个index查询。

1
2
3
4
5
6
7
8
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' )


替代hobodave的答案

1
2
3

您可以使用YEAR_MONTH作为单位,使用EXTRACT达到相同的目的,因此不需要AND,如下所示:


如果没有将来的日期...

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

经过测试。


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

这应返回上一个日历月的所有记录,而不是最近30或31天的记录。


尽管已经选择了该问题的答案,但是我相信最简单的查询是


1
2
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)

这对我有用(选择上个月创建的所有记录,而不管您本月运行查询的日期如何)


这是获取上个月记录的查询:

1
2
3
4
5
6
7
8
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已建立索引,则此索引将能够利用索引,因为它不会对字段值应用任何转换函数。


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