2009-07-16 81 views
18

我想计算上个月的总订单金额。MySQL Query计算上个月

我得到了从当前日期获取当前月份数据的查询。

SELECT SUM(goods_total) AS Total_Amount FROM orders 
WHERE order_placed_date >= date_sub(current_date, INTERVAL 1 MONTH); 

现在我怎样才能得到前几个月的数据只有本月不包括在内。

例如,本月(7月)我赚了15,000美元,上个月(6月)我赚了14,000美元。

我通过运行上述查询得到15,000美元。

但我不知道如何计算前几个月。

+0

“在哪里,” - 取出AND。 – 2009-07-16 14:58:13

+0

感谢您指出,我无意中在那里。 – 2009-07-16 15:08:49

回答

47

在这里你去,以此来获得最后一个月的第一个和最后上个月的日期在MySQL:如果你是懒惰它还挺方便使用

... order_placed_date BETWEEN DATE_FORMAT(NOW() - INTERVAL 1 MONTH, '%Y-%m-01 00:00:00') AND DATE_FORMAT(LAST_DAY(NOW() - INTERVAL 1 MONTH), '%Y-%m-%d 23:59:59')

+0

不客气。几个月前我遇到了同样的问题,并提出了这个问题。 – 2009-07-16 14:59:03

+1

谢谢你的工作完美,结果与我的数据相符。 – 2009-07-16 14:59:28

+0

我使用的是current_date而不是NOW() – 2009-07-16 15:09:20

0

...date_format(order_placed_date, '%Y-%m') = date_format(now() - INTERVAL 1 MONTH, '%Y-%m')

我认为这也增加了可读性。

0

这里是另一种方式,我发现:

SELECT SUM(goods_total) AS Total_Amount FROM orders 
WHERE SUBSTRING(o.order_placed_date FROM 1 FOR 7) = SUBSTRING(CURRENT_DATE - INTERVAL 1 MONTH FROM 1 FOR 7) 

这工作也是如此。

7

我发现Artem的查询没有从上个月的最后一天返回任何东西(可能是因为BETWEEN会从最后一天的时间00:00:00开始计算)。

这似乎适用于我在前一个月。

order_placed_date BETWEEN DATE_FORMAT(NOW() - INTERVAL 1 MONTH, '%Y-%m-01') 
AND DATE_FORMAT(NOW() ,'%Y-%m-01') 
0

这里的另一个解决方案 - 无需stringoperation

SELECT SUM(goods_total) AS Total_Amount FROM orders 
WHERE DATE(order_placed_date) 
BETWEEN DATE_ADD(LAST_DAY(DATE_SUB(NOW(), INTERVAL 2 MONTH)), INTERVAL 1 DAY) 
AND LAST_DAY(DATE_SUB(NOW(), INTERVAL 1 MONTH)); 
3

简单的解决方案:

SELECT SUM(goods_total) AS Total_Amount FROM orders 
WHERE YEAR(order_placed_date) = YEAR(CURDATE() - INTERVAL 1 MONTH) 
AND MONTH(order_placed_date) = MONTH(CURDATE() - INTERVAL 1 MONTH)