我需要一些帮助来编写MySQL查询来显示上个月的行,但不是整个月,只有直到与现在相同的一天,小时和分钟(),而是1个月前。
因此,例如,如果今天是 5 月 19 日下午 5:25,我需要选择从 4 月 12 日上午 12:00 到 4 月 19 日下午 5:25 的行(当然也是同年)。
谢谢!
您可以通过计算前一个月的last_day并添加一天来获得当月的第一天。这很尴尬,但我认为这比将日期格式化为字符串并将其用于计算要好。
select
*
from
yourtable t
where
/* Greater or equal to the start of last month */
t.date >= DATE_ADD(LAST_DAY(DATE_SUB(NOW(), INTERVAL 2 MONTH)), INTERVAL 1 DAY) and
/* Smaller or equal than one month ago */
t.date <= DATE_SUB(NOW(), INTERVAL 1 MONTH)
使用单个 MySQL 函数可以轻松获取一个月前:
SELECT DATE_SUB(NOW(), INTERVAL 1 MONTH);
或
SELECT NOW() - INTERVAL 1 MONTH;
在我的头顶上,我想不出一种优雅的方式来获得上个月的第一天在 MySQL 中,但这肯定会起作用:
SELECT CONCAT(LEFT(NOW() - INTERVAL 1 MONTH,7),'-01');
将它们放在一起,您将获得一个解决问题的查询:
SELECT *
FROM your_table
WHERE t >= CONCAT(LEFT(NOW() - INTERVAL 1 MONTH,7),'-01')
AND t <= NOW() - INTERVAL 1 MONTH
简单的代码请检查
SELECT * FROM table_name WHERE created >= (NOW() - INTERVAL 1 MONTH)
这是与您的问题相关的MySQL日期操作的示例:
SELECT DATE_ADD( now( ) , INTERVAL -1 MONTH )
以上将返回一个月前的日期时间
因此,您可以使用它,如下所示:
SELECT *
FROM your_table
WHERE Your_Date_Column BETWEEN '2011-01-04'
AND DATE_ADD(NOW( ), INTERVAL -1 MONTH )
SELECT
*
FROM
<table_name>
WHERE
<date_field> BETWEEN DATE_SUB(NOW(), INTERVAL 1 MONTH) AND NOW();
同样,您可以选择 1 个月、2 个月等的记录。
SELECT *
FROM table
WHERE date BETWEEN
ADDDATE(LAST_DAY(DATE_SUB(NOW(),INTERVAL 2 MONTH)), INTERVAL 1 DAY)
AND DATE_SUB(NOW(),INTERVAL 1 MONTH);
有关DATE_SUB
、ADDDATE
、LAST_DAY
和其他有用的日期时间函数的信息,请参阅文档。
如下WHERE
子句:
WHERE DateColumn BETWEEN
CAST(date_format(date_sub(NOW(), INTERVAL 1 MONTH),'%Y-%m-01') AS date)
AND
date_sub(now(), INTERVAL 1 MONTH)
SELECT *
FROM table
WHERE myDtate BETWEEN now()
, DATE_SUB(NOW()
, INTERVAL 1 MONTH)
我的解决方案是在用编程语言编写sql时避免使用NOW()
,并用字符串代替。 正如您所指出的NOW()
的问题在于它包括当前时间。 因此,要从查询日的开始(0 小时和分钟)捕获,而不是:
r.date <= DATE_SUB(NOW(), INTERVAL 99 DAY)
我做到了(php):
$current_sql_date = date('Y-m-d 00:00:00');
在 SQL 中:
$sql_x = "r.date <= DATE_SUB('$current_sql_date', INTERVAL 99 DAY)"
这样,您将从给定日期的午夜检索数据
也许是这样的 - 上个月日期(recDate)介于DATE_ADD(LAST_DAY(DATE_SUB(CURDATE(), 间隔 2 个月)), 间隔 1 天)和 LAST_DAY(DATE_SUB(CURDATE(), 间隔 1 个月) )