MySQL选择从上个月到(现在() - 1个月)的所有行,以进行比较

时间:2011-05-19 20:45:30

标签: mysql datetime

我需要一些帮助来编写一个MySQL查询,以显示上个月的行,但不是整个月,只是直到同一天,小时和分钟,就像现在(),但是在1个月之前。

所以例如,如果今天是5/19,下午5:25,我需要选择从4月19日午夜12点到4点到5点25分的行(当然也是同一年)。

谢谢!

10 个答案:

答案 0 :(得分:116)

您可以通过计算前一个月的最后一天并添加一天来获得本月的第一天。这很尴尬,但我认为这比将日期格式化为字符串更好,并将其用于计算。

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)

答案 1 :(得分:22)

一个月之前使用一个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

答案 2 :(得分:20)

简单代码请检查

SELECT * FROM table_name WHERE created <= (NOW() - INTERVAL 1 MONTH)

答案 3 :(得分:9)

这是与您的问题相关的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 )

答案 4 :(得分:4)

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_SUBADDDATELAST_DAY以及其他有用日期时间函数的信息,请参阅the docs

答案 5 :(得分:2)

您可以使用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)

答案 6 :(得分:0)

SELECT * FROM table WHERE myDtate BETWEEN now(),DATE_SUB(NOW(),INTERVAL 1 MONTH)

答案 7 :(得分:0)

SELECT * 
FROM 
     <table_name> 
WHERE 
     <date_field> 
BETWEEN 
     DATE_SUB(NOW(), INTERVAL 1 MONTH) AND NOW();

类似地,您可以选择1个月,2个月等的记录。

答案 8 :(得分:-1)

我的解决方案是避免在使用您的编程语言编写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)"

这样,您将从指定日期的午夜检索数据

答案 9 :(得分:-3)

可能是这样-上个月全部 DATE(recDate)在DATE_ADD(LAST_DAY(DATE_SUB(CURDATE(),间隔2个月)),间隔1天)和LAST_DAY(DATE_SUB(CURDATE(),间隔1个月))之间