#mysql #date #intervals #rowdeleting
#mysql #Дата #интервалы #удаление строк
Вопрос:
Я хочу удалять записи из моей таблицы, когда срок действия столбца с конечной датой превышает 3 года после текущей даты
Смотрите ниже, что я уже пробовал
DELETE FROM membership
WHERE (SELECT EXTRACT (YEAR FROM end_date)) <
(SELECT EXTRACT (YEAR FROM (SELECT DATE_ADD( CURDATE(), INTERVAL -4 YEAR))))
Я ожидаю, что результаты, относящиеся к 2016 году и ранее, будут удалены из моей таблицы
Заранее спасибо
Комментарии:
1.
WHERE End_Date < Date_Add(curdate(),Interval -4 Year)
Удалите все записи за 4 года до сегодняшнего дня.
Ответ №1:
Это приведет к удалению всего, что имеет end_date с годом 2016 или старше:
DELETE FROM membership WHERE YEAR(end_date) <= YEAR(CURDATE() - INTERVAL 3 YEAR);
РЕДАКТИРОВАТЬ: Если вы хотите удалить все с end_date, которым более 3 лет:
DELETE FROM membership WHERE end_date < NOW() - INTERVAL 3 YEAR;
Комментарии:
1. @Gary Mannion: Рад помочь!
2. Просто дополнительное замечание; если данных много , и год — это то, что имеет значение; вероятно, было бы лучше использовать
end_date <= (calculated last day or datetime of desired year)
. Если у вас есть индекс в end_date, YEAR(end_date) не позволит MySQL воспользоваться этим преимуществом.3. Я об этом не подумал. Этого можно было бы легко достичь, выполнив это:
DELETE FROM membership WHERE end_date < CONCAT(YEAR(CURDATE() - INTERVAL 2 YEAR), '-01-01');
Ответ №2:
Некоторые примечания:
- сравните пустой столбец
end_date
со значением в качестве типа даты - протестируйте выражения в операторах SELECT, прежде чем запускать DELETE
Какое значение первой даты больше, чем end_date в строках, которые вы хотите удалить? Протестируйте это выражение в инструкции SELECT.
SELECT DATE_FORMAT( NOW(), '%Y-01-01') INTERVAL -3 YEAR
ВОЗВРАТ
2016-01-01
или значение даты за четыре года до настоящего времени
SELECT DATE(NOW()) INTERVAL -4 YEAR
ВОЗВРАТ:
2015-04-05
корректируйте это выражение, пока оно не вернет нужное нам значение. Затем мы можем включить это выражение в инструкцию, сравнивая с пустым столбцом end_date
column, вот так:
SELECT m.*
FROM membership m
WHERE m.end_date < DATE(NOW()) INTERVAL -4 YEAR
ORDER BY m.end_date DESC
или, если мы знаем, что значение даты, которое нам нужно, равно '2015-04-05'
or '2017-01-01'
, тогда мы можем просто указать это как литерал:
SELECT m.*
FROM membership m
WHERE m.end_date < '2017-01-01' INTERVAL 0 MONTH
ORDER BY m.end_date DESC
После того, как мы подтвердим, что оператор SELECT возвращает набор строк, которые мы хотим удалить, мы можем заменить SELECT
ключевое слово на DELETE
.