【发布时间】:2011-01-06 14:35:35
【问题描述】:
我需要选择我的数据库中上个月创建的所有行。
例如,如果当前月份是 1 月,那么我想返回 12 月创建的所有行,如果月份是 2 月,那么我想返回 1 月份创建的所有行。我的数据库中有一个date_created 列,其中列出了以这种格式创建的日期:2007-06-05 14:50:17。
【问题讨论】:
标签: mysql
我需要选择我的数据库中上个月创建的所有行。
例如,如果当前月份是 1 月,那么我想返回 12 月创建的所有行,如果月份是 2 月,那么我想返回 1 月份创建的所有行。我的数据库中有一个date_created 列,其中列出了以这种格式创建的日期:2007-06-05 14:50:17。
【问题讨论】:
标签: mysql
单一条件的替代方案
SELECT * FROM table
WHERE YEAR(date_created) * 12 + MONTH(date_created)
= YEAR(CURRENT_DATE) * 12 + MONTH(CURRENT_DATE) - 1
【讨论】:
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 yourtable
where DATE_FORMAT(date_created, '%Y-%m') = date_format(DATE_SUB(curdate(), INTERVAL 1 month),'%Y-%m')
这应该返回上一个日历月的所有记录,而不是过去 30 天或 31 天的记录。
【讨论】:
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)
这对我有用(选择从上个月创建的所有记录,无论您本月运行查询的哪一天)
【讨论】:
这是获取上个月记录的查询:
SELECT *
FROM `tablename`
WHERE `datefiled`
BETWEEN DATE_SUB( DATE( NOW( ) ) , INTERVAL 1
MONTH )
AND
LAST_DAY( DATE_SUB( DATE( NOW( ) ) , INTERVAL 1
MONTH ) )
问候 - 萨奇布
【讨论】:
尽管已经选择了这个问题的答案,但是,我相信最简单的查询将是
SELECT *
FROM table
WHERE
date_created BETWEEN (CURRENT_DATE() - INTERVAL 1 MONTH) AND CURRENT_DATE();
【讨论】:
SELECT * FROM table
WHERE YEAR(date_created) = YEAR(CURRENT_DATE - INTERVAL 1 MONTH)
AND MONTH(date_created) = MONTH(CURRENT_DATE - INTERVAL 1 MONTH)
您可以使用 EXTRACT 实现相同的效果,使用 YEAR_MONTH 作为单位,因此您不需要 AND,如下所示:
SELECT * FROM table
WHERE EXTRACT(YEAR_MONTH FROM date_created) = EXTRACT(YEAR_MONTH FROM CURDATE() - INTERVAL
1 MONTH)
【讨论】:
YEAR_WEEK temporal interval,所以如果你需要几周而不是几个月,你就不得不回退到 hobodave 的答案。
如果没有未来日期...
SELECT *
FROM table_name
WHERE date_created > (NOW() - INTERVAL 1 MONTH);
经过测试。
【讨论】:
这是另一种选择。假设您有一个索引的 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' )
【讨论】:
DATE_FORMAT 周围抛出一个STR_TO_DATE,所以它总是处理日期对象。
select fields FROM table
WHERE date_created LIKE concat(LEFT(DATE_SUB(NOW(), interval 1 month),7),'%');
如果你的 date_created 被索引,这个将能够利用索引,因为它不会对字段值应用任何转换函数。
【讨论】:
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();
between 包括边界。它也包括当前日期。为什么/如何限制在昨天?请详细说明?
current_date 不是今天,而是客户提供的随机日期怎么办?