ИНТЕРВАЛ 30 ДНЕЙ не дает ожидаемого результата

Я немного знаком с MySQL DATE и DATE_FORMAT.

Однако при выполнении запроса для диапазона дат с использованием ИНТЕРВАЛ - 30 ДНЕЙ я либо не получаю правильный вывод, либо выдает ошибку. Глядя дальше в таблицу, вы понимаете, что каждая строка для date_buy имеет формат следующего типа: понедельник, 09 сентября 2015 г. и т. д. Я пытался использовать PHP date('D d F Y') вместо DATE(NOW()) и такое, но я не могу решить проблему. Есть ли другой известный обходной путь для этого?

И да, пробовал МЕЖДУ date_buy_x и date_buy_y. Он ничего не возвращает, даже если в таблице есть записи.

SELECT SUM(sales_total), date_buy FROM `Sebastian Estate Sales` 
WHERE date_buy >= $date - INTERVAL 30 DAY 
GROUP BY date_buy

SELECT SUM(sales_total), date_buy FROM `Sebastian Estate Sales` 
WHERE date_buy BETWEEN date_buy_x && date_buy_y
GROUP BY date_buy ORDER BY date_buy DESC

ОБНОВЛЕНИЕ

ТАК, на основе предложений и дальнейшего изучения параметров DATE_FORMAT и CURDATE, удалось отобразить данные. ORDER BY также должен быть в формате DATE_FORMAT(date_buy, '%a %d %M %Y') для правильного вывода. Однако по-прежнему остается проблема с параметром INTERVAL 30 DAY.

WHERE datebuy <= DATE_FORMAT(CURDATE() - INTERVAL 30 DAY,'%a %d %M %Y')
GROUP BY date_buy ORDER BY DATE_FORMAT(date_buy, '%a %d %M %Y') DESC

Это возвращает данные, но все еще выходит за пределы диапазона, что заставляет меня думать, что он не принимает запрос INTERVAL.

Sat 22 November 2014 (50 sales) 
Thu 18 December 2014 (50 sales) 
Thu 22 January 2015 (20 sales) 
Sun 25 January 2015 (20 sales) 
Mon 06 April 2015 (25 sales) 
Sun 12 April 2015 (25 sales) 
Mon 03 August 2015 (10 sales)

Когда вывод должен быть только:

Mon 03 August 2015 (10 sales)

person charless    schedule 09.09.2015    source источник
comment
не храните даты в виде строк! ужастик. исправь хранилище даты, все остальное само исправится   -  person    schedule 10.09.2015
comment
Дагон. Решение нуждается в этом конкретном формате даты для других отображений на страницах, поэтому оно сохраняет данные таким образом. Фиксация текущей даты в строках будет проблемой.   -  person charless    schedule 10.09.2015
comment
Напишите что-нибудь, чтобы прочитать даты из этого поля, проанализировать их и сохранить в правильном формате даты в новое поле, которое вы будете использовать с этого момента.   -  person developerwjk    schedule 10.09.2015
comment
Необходимость отображать дату в этом формате на нескольких страницах означает, что вы используете оператор select с DATE_FORMAT(...), чтобы получить ее в этом формате, а не хранить ее в этом формате.   -  person developerwjk    schedule 10.09.2015
comment
Правильный. Я унаследовал это от другой компании по развитию. Пытаюсь найти постоянное исправление, а не повязку. Моей первой мыслью было проанализировать текущий формат, как было предложено, удалив часть даты (D), а затем обновить все записи, но я хотел посмотреть, есть ли другое, более относительное решение.   -  person charless    schedule 10.09.2015
comment
вы не храните данные в том формате, в котором хотите их отображать, это разные вещи.   -  person    schedule 10.09.2015
comment
Да, я знаю это. Обычно я предпочитаю вместо этого использовать DATE или TIMESTAMP. Но в данном конкретном случае клиенту нужен элемент День. Я предполагаю, что именно поэтому использовался строковый стиль.   -  person charless    schedule 10.09.2015
comment
VJK, да, я знаю. Но, как сказано, нужно сохранить дату (D) и сохранить ее для отображения. Однако мне любопытно, почему строковая дата не может быть прочитана как DATE или DATE_FORMAT.   -  person charless    schedule 10.09.2015
comment
Можете ли вы опубликовать вывод DESC `Sebastian Estate Sales`   -  person Mike G    schedule 10.09.2015
comment
это был отличный ресурс: web.calstatela.edu/faculty/ jchen13/Документы/CS122/Лекции/   -  person charless    schedule 10.09.2015


Ответы (2)


Вы могли бы сделать:

SELECT SUM(sales_total), date_buy FROM `Sebastian Estate Sales` 
WHERE DATE(STR_TO_DATE(date_buy, '%a %d %M %Y')) >= $date - INTERVAL 30 DAY 
GROUP BY date_buy

Если $date также не находится в этом строковом формате, в этом случае вам также нужно использовать функцию STR_TO_DATE.

SELECT SUM(sales_total), date_buy FROM `Sebastian Estate Sales` 
WHERE DATE(STR_TO_DATE(date_buy, '%a %d %M %Y')) >= DATE(STR_TO_DATE($date, '%a %d %M %Y')) - INTERVAL 30 DAY 
GROUP BY date_buy
person developerwjk    schedule 09.09.2015
comment
Я полностью упустил из виду %a. Я попробовал %W, который оказался длинным днем. {{ морда себя лицом }}. Спасибо друг. Я попробую. - person charless; 10.09.2015
comment
надеюсь, у вас не так много данных, так как это убивает производительность - person ; 10.09.2015
comment
Я бы использовал STR_TO_DATE, чтобы проанализировать дату и обновить новое поле, а затем переключить поля или что-то в этом роде, поскольку постоянное преобразование в предложениях where повредит производительности. - person developerwjk; 10.09.2015

как насчет date_sub(), используйте date_format в том же формате при запросе

SELECT SUM(sales_total), date_buy FROM `Sebastian Estate Sales` 
WHERE DATE_FORMAT(DATE(date_buy,'%Y %m %d')) >= DATE_FORMAT(DATE_SUB(DATE($date,INTERVAL 30 DAY),'%Y %m %d'))  
GROUP BY date_buy
person David Jaw Hpan    schedule 10.09.2015