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

lew*_*qic 74 mysql

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

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

hob*_*ave 176

SELECT * FROM table
WHERE YEAR(date_created) = YEAR(CURRENT_DATE - INTERVAL 1 MONTH)
AND MONTH(date_created) = MONTH(CURRENT_DATE - INTERVAL 1 MONTH)
Run Code Online (Sandbox Code Playgroud)

  • `SELECT*FROM表WHERE date_created BETWEEN(CURRENT_DATE() - INTERVAL 1月)和CURRENT_DATE();` (60认同)
  • @GhazanfarMir您的查询与问题不完全匹配,而上面的答案确实如此.你们在上个月到昨天之间的这一天之间返回行. (8认同)
  • 我明白你的意思了..是的你是对的..我的询问不是OP想要的......我误解了这个问题 (4认同)

mar*_*ton 19

这是另一种选择.假设您有索引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' )
Run Code Online (Sandbox Code Playgroud)


eke*_*ner 13

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

SELECT * 
FROM   table_name 
WHERE  date_created > (NOW() - INTERVAL 1 MONTH);
Run Code Online (Sandbox Code Playgroud)

测试.

  • 我认为他们正在寻找不同的东西.即上个月的所有记录(即2012年10月1日至10月31日23:59:59).上面的查询将从今天的日期和*时间*返回最后约30天左右. (2认同)

SMT*_*MTF 11

也可以选择霍博德的答案

SELECT * FROM table
WHERE YEAR(date_created) = YEAR(CURRENT_DATE - INTERVAL 1 MONTH)
AND MONTH(date_created) = MONTH(CURRENT_DATE - INTERVAL 1 MONTH)
Run Code Online (Sandbox Code Playgroud)

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

SELECT * FROM table
WHERE EXTRACT(YEAR_MONTH FROM date_created) = EXTRACT(YEAR_MONTH FROM CURDATE() - INTERVAL
1 MONTH)
Run Code Online (Sandbox Code Playgroud)


小智 6

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

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