Проблема с получением записей за последние 13 месяцев в MySQL - PullRequest
0 голосов
/ 07 марта 2020

Я работаю над тем, чтобы получить записи за последние 13 месяцев, используя следующий MySQL запрос:

SELECT YEAR(`customer_date`),
       MONTHNAME(`customer_date`),
       COUNT(`customer_date`) AS Enquiries
FROM   `crm_customers`
WHERE  DATE(`customer_date`) BETWEEN CURRENT_DATE - INTERVAL 13 month AND
                                     CURRENT_DATE
GROUP  BY YEAR(`customer_date`),
          MONTH(`customer_date`)
ORDER  BY YEAR(`customer_date`) DESC,
          MONTH(`customer_date`) DESC  

Мой прототип MySQL Таблица crm_customers выглядит так:

customer_id    customer_date
1              2019-02-01 00:00:00
2              2019-02-02 00:00:00
...            ...
...            ...
...            ...

Вывод:

enter image description here

Хотя приведенный выше запрос работает нормально и дает мне почти правильный набор результатов, за исключением одной проблемы, связанной с последним месяцем последний год с разрывом в 13 месяцев с сегодняшнего дня.

Сегодня 7 марта 2020 г. Условие даты в моем запросе

WHERE  DATE(`customer_date`) BETWEEN CURRENT_DATE - INTERVAL 13 month AND CURRENT_DATE

начинает извлекать результат с 7 февраля 2019 г. .

В феврале 2019 года у меня 104 записи. Но мой выше SQL выбирает только 80 записей, потому что 24 записи до 07 февраля 2019 года (между 1 февраля и 6 февраля 2019 года). Я хочу также включить эти записи. Как я могу изменить условие даты для достижения необходимого результата.

РЕДАКТИРОВАТЬ

Почему этот вопрос помечен как отрицательный? Я не понимаю Вопрос очень понятен и не продублирован. За это проголосовал GMB?

Ответы [ 4 ]

1 голос
/ 07 марта 2020

измените предложение WHERE на:

WHERE  DATE(`customer_date`) BETWEEN DATE_FORMAT(NOW() ,'%Y-%m-01') - INTERVAL 13 month AND DATE_FORMAT(NOW() ,'%Y-%m-01')
0 голосов
/ 08 марта 2020

Я бы предложил:

where 
    customer_date >= date_format(current_date, '%Y-%m-01') - interval 13 month
    and customer_date < current_date + interval 1 day

Обоснование:

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

  • арифметика дат максимально проста; MySQL счастливо обрабатывает строки в правильных форматах как даты, что может сократить синтаксис

0 голосов
/ 07 марта 2020

Звучит так, как будто вы хотите снизить точность значения DATE. Для этого используйте EXTRACT();

EXTRACT(YEAR_MONTH FROM CURDATE() - INTERVAL 13 MONTH)
0 голосов
/ 07 марта 2020

Есть некоторая возможность достичь этого

SELECT CURDATE()
, CAST(DATE_FORMAT(NOW() ,'%Y-%m-01') as DATE)
,LAST_DAY(NOW() - INTERVAL 1 MONTH) + INTERVAL 1 DAY;

Результаты в

CURDATE() , CAST(DATE_FORMAT(NOW() ,'%Y-%m-01') as DATE), LAST_DAY(NOW() - INTERVAL 1 MONTH) + INTERVAL 1 DAY
2020-03-07, 2020-03-01                                  , 2020-03-01
...