Получить записи за последний год до последней даты предыдущего месяца в MySQL - PullRequest
0 голосов
/ 08 мая 2019

Я пытаюсь получить записи за последний год и до последней даты текущего месяца, т.е. не включая текущий месяц.Вот мой запрос:

SELECT `customer_id`, `customer_name`, `customer_date` 
FROM `customers` 
WHERE DATE(`customer_date`) <= (CURDATE() - INTERVAL 1 MONTH) 
      AND DATE(customer_date) >= (CURDATE() - INTERVAL 12 MONTH)

Этот запрос извлекает записи с 1 мая 2018 года по 8 апреля 2019 года.

ИНТЕРВАЛ 1 МЕСЯЦ извлекает записи 30 дней назад.Что мне нужно сделать здесь?

Я хочу исключить записи текущего месяца, поэтому запрос должен возвращать записи до 30 апреля 2019 года. Как нам это сделать?

Ответы [ 3 ]

1 голос
/ 08 мая 2019

Вы должны правильно рассчитать первый и последний дни диапазона с помощью функции LAST_DAY().Например:

Рассчитать первый день диапазона

SELECT LAST_DAY(CURDATE() - INTERVAL 13 MONTH) + INTERVAL 1 DAY

Вывод:

2018-05-01

Вычислить последний день диапазона

SELECT LAST_DAY(CURDATE() - INTERVAL 1 MONTH)

Вывод:

2019-04-30

Полный запрос может выглядеть следующим образом:

SELECT `customer_id`, `customer_name`, `customer_date` 
FROM `customers` 
WHERE `customer_date` >= LAST_DAY(CURDATE() - INTERVAL 13 MONTH) + INTERVAL 1 DAY 
   AND `customer_date` <= SELECT LAST_DAY(CURDATE() - INTERVAL 1 MONTH)
0 голосов
/ 08 мая 2019

Чтобы получить данные за предыдущий месяц:

where customer_date < curdate() + interval (1 - day(curdate()) day

Почему?Прежде всего обратите внимание, что на customer_date нет вызова функции.Таким образом, это выражение совместимо с индексом и может использовать индекс.

Во-вторых, эта структура работает как для даты, так и для даты / времени.Это очень удобно, потому что это не всегда может быть очевидно, если в столбце есть компонент времени (люди не очень хорошо умеют называть столбцы для сбора этой информации).

Вы утверждаете, что часть "12 месяцев" назадработает.Это не выглядит правильным для меня.Для полной логики:

where customer_date < curdate() + interval (1 - day(curdate()) day and
      customer_date >= (curdate() + interval (1 - day(curdate()) day) - interval 1 year)
0 голосов
/ 08 мая 2019
SELECT `customer_id`, `customer_name`, `customer_date` FROM `customers` WHERE
MONTH(`customer_date`) <= (CURDATE() - INTERVAL 1 MONTH) AND 
MONTH(customer_date) >= (CURDATE() - INTERVAL 12 MONTH)

надеюсь, что это поможет

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