2009-07-16 5 views
18

Хотелось бы рассчитать общую сумму заказа в прошлом месяце.Запрос MySQL для расчета предыдущего месяца

У меня есть запрос на получение данных за текущий месяц с текущей даты.

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

Теперь, как я могу получить данные за предыдущие месяцы, за исключением этого месяца.

См., Например, В этом месяце (июль) я составил 15 000 долларов, а в прошлом месяце (июнь) я составил 14 000 долларов.

Я получаю $ 15 000, выполнив указанный выше запрос.

Но я не знаю, как рассчитать предыдущие месяцы.

+0

"ГДЕ И" - вынимают и. –

+0

Спасибо, что указали это, я случайно попал в него. –

ответ

47

Здесь вы идете, использовать это, чтобы получить дату между 1-м прошлого месяца, а последний в прошлом месяце в 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

Добро пожаловать. У меня была та же проблема несколько месяцев назад, и я придумал это. –

+1

Спасибо, что он работал отлично, результат соответствовал моим данным. –

+0

Я использую current_date вместо NOW() –

0

Если вы ленивы это своего рода удобно использовать

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

Я думаю, что это также повышает удобочитаемость.

+0

Проблема с вашим запросом заключается в том, что он выполнит полное сканирование таблицы и будет иметь ужасную производительность на больших наборах данных, потому что он не будет использовать индекс. Запрос с BETWEEN, который я опубликовал, использует диапазон, поэтому он сможет использовать индекс. Читабельность ...Я думаю, что оба читаемы :) –

+0

Oh и FYI, MySQL не поддерживает индексы на основе функций. PostgreSQL якобы делает. –

+0

Извините, я вижу это сейчас. Я просто использую это из таблиц до нескольких сотен записей. Благодарю. – 2009-07-16 16:06:37

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) 

Это работает, как хорошо.

+0

Такая же проблема, как выше, я думаю. Запустите все SELECT через EXPLAIN (просто добавьте EXPLAIN к каждому SELECT) и посмотрите, какая информация EXPLAIN дает вам информацию об эффективности каждого запроса. –

+0

То есть, если вы создали индекс на order_placed_date. Вы сделали? ПРАВИЛЬНО? –

+0

В разделе «Индексы» параметры order_placed_date: Non_Unique = 1, Seq_in_Index = 1, IndexType = BTREE –

7

Я обнаружил, что запрос Артема ничего не возвращал с последнего дня предыдущего месяца (предположительно, так как МЕЖДУ будет вычисляться со времени 00:00:00 последнего дня).

Это, похоже, работает для меня в течение предыдущего месяца.

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

Спасибо, плохо попробуйте –

+0

Я обновил свой запрос, чтобы работать правильно, немного иначе, чем ваш. –

+0

Да, это выглядит хорошо. – Shane

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) 
Смежные вопросы