【发布时间】:2011-08-29 05:05:12
【问题描述】:
我需要一些帮助来编写一个 MySQL 查询来显示上个月的行,但不是整个月,只是直到现在()的同一天、小时和分钟,但 1 个月前。
例如,如果今天是 5 月 19 日下午 5 点 25 分,我需要选择从 4 月 1 日午夜 12:00 到 4 月 19 日下午 5:25 的行(当然也是同年)。
谢谢!
【问题讨论】:
我需要一些帮助来编写一个 MySQL 查询来显示上个月的行,但不是整个月,只是直到现在()的同一天、小时和分钟,但 1 个月前。
例如,如果今天是 5 月 19 日下午 5 点 25 分,我需要选择从 4 月 1 日午夜 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)
【讨论】:
SET @FirstDayLastMonth = (DATE_ADD(LAST_DAY(DATE_SUB(NOW(), INTERVAL 2 MONTH)), INTERVAL 1 DAY));,然后使用了SET @LastDayLastMonth = (LAST_Day(@FirstDayLastMonth));,因为我需要获取上个月的第一天和最后一天。非常感谢 GolezTrol!!!
只需一个 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)
【讨论】:
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 和其他有用的日期时间函数的信息,请参阅the docs。
【讨论】:
您可以使用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)"
这样,您将从指定日期的午夜开始检索数据
【讨论】:
SELECT DAY(NOW());,在昨天使用类似的内容SELECT DAY(NOW() - INTERVAL 1 DAY);
也许像这样 - 整个上个月 DATE(recDate) BETWEEN DATE_ADD(LAST_DAY(DATE_SUB(CURDATE(), INTERVAL 2 MONTH)), INTERVAL 1 DAY) AND LAST_DAY(DATE_SUB(CURDATE(), INTERVAL 1 MONTH))
【讨论】: