我需要选择上个月创建的数据库中的所有行 .
例如,如果当前月份是1月,那么我想返回12月创建的所有行,如果月份是2月,那么我想返回1月份创建的所有行 . 我的数据库中有一个 date_created 列,列出了以这种格式创建的日期: 2007-06-05 14:50:17 .
date_created
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)
这是另一种选择 . 假设您有一个索引 DATE 或 DATETIME 类型字段,这应该使用索引,因为格式化日期将在使用索引之前进行类型转换 . 然后,当使用EXPLAIN查看时,您应该看到 range 查询而不是 index 查询 .
DATE
DATETIME
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' )
如果没有未来日期......
SELECT * FROM table_name WHERE date_created > (NOW() - INTERVAL 1 MONTH);
测试 .
hobodave's answer的替代方案
使用YEAR_MONTH作为单位,您可以使用EXTRACT实现相同的功能,因此您不需要AND,如下所示:
SELECT * FROM table WHERE EXTRACT(YEAR_MONTH FROM date_created) = EXTRACT(YEAR_MONTH FROM CURDATE() - INTERVAL 1 MONTH)
SELECT * FROM yourtable where DATE_FORMAT(date_created, '%Y-%m') = date_format(DATE_SUB(curdate(), INTERVAL 1 month),'%Y-%m')
这应返回上一个日历月的所有记录,而不是过去30或31天的记录 .
尽管已经选择了这个问题的答案,但我相信最简单的查询
SELECT * FROM table WHERE date_created BETWEEN (CURRENT_DATE() - INTERVAL 1 MONTH) AND CURRENT_DATE();
以下是获取上个月记录的查询:
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进行索引,则此方法将能够利用索引,因为它不会对字段值应用任何转换函数 .
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 回答
这是另一种选择 . 假设您有一个索引
DATE
或DATETIME
类型字段,这应该使用索引,因为格式化日期将在使用索引之前进行类型转换 . 然后,当使用EXPLAIN查看时,您应该看到range
查询而不是index
查询 .如果没有未来日期......
测试 .
hobodave's answer的替代方案
使用YEAR_MONTH作为单位,您可以使用EXTRACT实现相同的功能,因此您不需要AND,如下所示:
这应返回上一个日历月的所有记录,而不是过去30或31天的记录 .
尽管已经选择了这个问题的答案,但我相信最简单的查询
以下是获取上个月记录的查询:
问候 - saqib
select fields FROM table WHERE date_created LIKE concat(LEFT(DATE_SUB(NOW(), interval 1 month),7),'%');
如果对date_created进行索引,则此方法将能够利用索引,因为它不会对字段值应用任何转换函数 .
这对我有用(选择从上个月创建的所有记录,无论您本月运行查询的那一天)