查询以获取上个月的所有行

时间:2010-01-19 00:26:40

标签: mysql

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

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

12 个答案:

答案 0 :(得分:168)

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

答案 1 :(得分:17)

这是另一种选择。假设您有一个索引DATEDATETIME类型字段,这应该使用索引,因为格式化日期将在使用索引之前进行类型转换。然后,当您使用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' )

答案 2 :(得分:13)

如果没有未来日期......

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

测试。

答案 3 :(得分:11)

hobodave's answer

的替代方案
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)

答案 4 :(得分:5)

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

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

答案 5 :(得分:2)

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

SELECT * 
FROM table 
WHERE 
date_created BETWEEN (CURRENT_DATE() - INTERVAL 1 MONTH) AND CURRENT_DATE();

答案 6 :(得分:2)

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

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

此致 - saqib

答案 7 :(得分:1)

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

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

答案 8 :(得分:1)

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) 

这对我有用(选择上个月创建的所有记录,无论您本月运行查询的那一天)

答案 9 :(得分:0)

单一条件的替代

SELECT * FROM table
WHERE YEAR(date_created) * 12 + MONTH(date_created)
    = YEAR(CURRENT_DATE) * 12 + MONTH(CURRENT_DATE) - 1

答案 10 :(得分:-1)

  

在MONTH(CURRENT_DATE())-1处非常快

 select MONTH(CURRENT_DATE())-1

答案 11 :(得分:-1)

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