MySQL Query для расчета предыдущего месяца - PullRequest
20 голосов
/ 16 июля 2009

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

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

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, выполнив вышеуказанный запрос.

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

Ответы [ 6 ]

55 голосов
/ 16 июля 2009

Вот, пожалуйста, используйте это, чтобы получить дату между 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')
7 голосов
/ 01 декабря 2011

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

Кажется, это работает для меня в предыдущем месяце.

order_placed_date BETWEEN DATE_FORMAT(NOW() - INTERVAL 1 MONTH, '%Y-%m-01')
AND DATE_FORMAT(NOW() ,'%Y-%m-01')
5 голосов
/ 21 февраля 2015

Самое простое решение:

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)
0 голосов
/ 09 января 2014

здесь другое решение - без строковой операции

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));
0 голосов
/ 16 июля 2009

Вот еще один способ, который я нашел:

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 голосов
/ 16 июля 2009

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...