我需要选择数据库中上个月创建的所有行。
例如,如果当前月份是一月,那么我想返回在十二月创建的所有行,如果月份是二月,那么我想返回在一月份创建的所有行。date_created
我的数据库中有一列,以这种格式列出创建日期:2007-06-05 14:50:17
。
Answers:
SELECT * FROM table
WHERE YEAR(date_created) = YEAR(CURRENT_DATE - INTERVAL 1 MONTH)
AND MONTH(date_created) = MONTH(CURRENT_DATE - INTERVAL 1 MONTH)
between
包含边界。.它将也包括当前日期。为什么/如何仅限于昨天?请详细说明?
current_date
不是今天而是客户指定的随机日期怎么办?
这是另一种选择。假设您有一个索引字段DATE
或DATETIME
类型字段,则应使用索引,因为格式化的日期将在使用索引之前进行类型转换。当使用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' )
STR_TO_DATE
,DATE_FORMAT
所以它总是与日期对象打交道。
如果没有将来的日期...
SELECT *
FROM table_name
WHERE date_created > (NOW() - INTERVAL 1 MONTH);
经过测试。
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)
尽管已经选择了该问题的答案,但是我相信最简单的查询是
SELECT *
FROM table
WHERE
date_created BETWEEN (CURRENT_DATE() - INTERVAL 1 MONTH) AND CURRENT_DATE();
select fields FROM table
WHERE date_created LIKE concat(LEFT(DATE_SUB(NOW(), interval 1 month),7),'%');
如果您的date_created已建立索引,则此索引将能够利用索引,因为它不会对字段值应用任何转换函数。
这是获取上个月记录的查询:
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 * FROM table
WHERE YEAR(date_created) = YEAR(CURRENT_DATE - INTERVAL 1 MONTH)
AND MONTH(date_created) = MONTH(CURRENT_DATE - INTERVAL 1 MONTH)
SELECT * FROM table WHERE date_created BETWEEN (CURRENT_DATE() - INTERVAL 1 MONTH) AND CURRENT_DATE();