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


71

我需要一些帮助来编写MySQL查询,以显示上个月的行,但不显示整个月的行,仅显示直到now,(h)和同一天,一小时和一分钟,直到1个月为止。

因此,例如,如果今天是下午5:25的5/19,我需要从4/1的午夜12:00 am 4/1到5:25 pm(当然也从同一年)中选择行。

谢谢!

Answers:


129

您可以通过计算前一个月的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)

5
+1一种无需字符串转换即可检索上个月第一天的好方法
Andomar 2011年

2
+1非常好...。我习惯了SET @FirstDayLastMonth = (DATE_ADD(LAST_DAY(DATE_SUB(NOW(), INTERVAL 2 MONTH)), INTERVAL 1 DAY));,然后SET @LastDayLastMonth = (LAST_Day(@FirstDayLastMonth));我需要上个月的第一天和最后一天。非常感谢GolezTrol !!!
比特币惨案狂人

38

只需一个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

23

简单的代码请检查

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

1
它不应该大于等于吗?SELECT * FROM table_name WHERE created >= (NOW() - INTERVAL 1 MONTH)
AFwcxx

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 )

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

同样,您可以选择1个月,2个月等的记录。


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);

有关,和其他有用的datetime函数的信息,请参阅文档DATE_SUBADDDATELAST_DAY


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)

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

-1

我的解决方案是避免在使用NOW()编程语言编写sql时使用,而用字符串代替。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);
Federico

-3

可能是这样-上个月的所有DATE(recDate)在DATE_ADD(LAST_DAY(DATE_SUB(CURDATE(),INTERVAL 2 MONTH)),INTERVAL 1 DAY)和LAST_DAY(DATE_SUB(CURDATE(),INTERVAL 1 MONTH))之间

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.