在MySQL中获取最后X个日期

时间:2013-12-31 21:01:01

标签: php mysql sql

我有一个SQL查询,可以检索最近7个月的付款,计算总和,并根据相关月份对它们进行分组......

查询的唯一问题是,由于某种原因,在每个月的31日,它会混乱。为了不那么模糊,而不是过去7个月(应该排除当前月份),它会把当前月份当作上个月(就好像我们已经在1月份,而今天的实际日期是31个月) 12月)。

SELECT DATE(date) AS month, SUM(amount_paid) AS amount FROM payments WHERE date > DATE_SUB(NOW(), INTERVAL 7 MONTH) GROUP BY YEAR(date), MONTH(date)");

所以要打破这个,结果应该是这样的:

0 => 2013-05-01
1 => 2013-06-03
2 => 2013-07-01
3 => 2013-08-01
4 => 2013-09-02
5 => 2013-10-01
6 => 2013-11-01

然而,结果如下:

0 => 2013-06-03
1 => 2013-07-01
2 => 2013-08-01
3 => 2013-09-02
4 => 2013-10-01
5 => 2013-11-01
6 => 2013-12-02

我想说我发现了MySQL date_sub的一个错误,但我知道查询中某处有错误。而且,今天是12月31日,它只发生在任何一个月的第31天。

干杯!

2 个答案:

答案 0 :(得分:0)

仍在努力为你解答,但我想知道它是否与此有关:

“如果您添加MONTH,YEAR_MONTH或YEAR,并且结果日期的日期大于新月份的最大日期,则将该日期调整为新月份的最大天数”

mysql> SELECT DATE_ADD('2009-01-30', INTERVAL 1 MONTH); -> '2009-02-28'

http://dev.mysql.com/doc/refman/5.1/en/date-and-time-functions.html#function_date-add

答案 1 :(得分:0)

所以我认为以下答案是礼貌的:Get the values for last 6 months in mysql

这是我的MYSQL查询现在的样子。它很乱,我觉得DATE_SUB应该仍然可以完成这项工作但是:

SELECT DATE(date) AS month, SUM(amount_paid) AS amount 
FROM 
    payments 
WHERE 
    DATE_FORMAT(date,'%Y-%m') < DATE_FORMAT(NOW(),'%Y-%m') 
AND 
    DATE_FORMAT(date,'%Y-%m') >= DATE_FORMAT(NOW() - INTERVAL 7 MONTH,'%Y-%m') 
GROUP BY 
    YEAR(date), MONTH(date)