2013-11-26 3 views
-1

Вот мой запрос:мне нужен запрос, чтобы удалить строку, если дата истек

DELETE FROM `upcoming` WHERE `Date` < DATE_FORMAT(CURDATE(), '%M-%d-%y') 

Когда я запускаю его, он удаляет все, что в моей таблице. Дата - столбец, в который я помещаю даты предстоящих событий. Это то, что у меня есть в моем столе. Он должен удалять только одну дату, не обе из них.

Таблица:

Даты
12-25-13 
11-11-13 

сегодняшних:

11-25-13 
+0

Не 'date' зарезервированное слово в mysql? – Babblo

+2

Если ваши даты отформатированы mm-dd-yy, почему ваш запрос использует mm/dd/yy? –

+0

Это может быть полезно: [Удаление всех строк старше 5 дней] (http://stackoverflow.com/questions/5853543/deleting-all-rows-older-than-5-days) – showdev

ответ

0

Попробуйте

DELETE FROM `upcoming` WHERE STR_TO_DATE(`Date`, '%M-%d-%y') < DATE_FORMAT(CURDATE(), '%M-%d-%y') 
0

Нормативная модель должны использовать DATE тип данных для значений даты магазина.

Похоже, вы сохраняете свои значения «даты» как VARCHAR в формате «mm-dd-yy». Сравнение выражений VARCHAR выполняется символом по символу слева направо. Представление символа, с первым месяцем, не находится в каноническом порядке, то есть некоторая величина значений mm-dd-yy не будет сортироваться в порядке дат, например. '01 -01-13 '(январь 2013 г.) будет сортироваться до '11 -27-12' (ноябрь 2012 г.).

Простейший подход в терминах оператора SQL состоит в том, чтобы преобразовать VARCHAR в тип данных DATE и сравнить его с выражением, которое также возвращает DATE.

DELETE FROM `upcoming` WHERE STR_TO_DATE(`Date`,'%m-%d-%y') < CURDATE() 

С точки зрения производительности MySQL не может выполнять сканирование диапазона индексов для удовлетворения этого предиката. Каждая строка в таблице должна быть проверена, чтобы выполнить преобразование, а затем сравнение. Если столбец был сохранен как DATE, то в предикат можно было бы указать пустой столбец, и MySQL мог бы использовать сканирование диапазона индексов.


ТАКЖЕ: '%M' спецификатор формата возвращает название месяца «январь», «февраль», и т.д. '%m' спецификатор возвращает числовой месяц «01», «02».

Смежные вопросы