Удаление записей, которые старше 4 лет с сегодняшней даты на MySQL - PullRequest
0 голосов
/ 05 апреля 2019

Я хочу удалить записи из моей таблицы, когда срок действия столбца конечной даты превышает 3 года после текущей даты

Ниже описано, что я уже пробовал

DELETE FROM membership
WHERE (SELECT EXTRACT (YEAR FROM end_date)) <
(SELECT EXTRACT (YEAR FROM (SELECT DATE_ADD( CURDATE(), INTERVAL -4 YEAR))))

Iожидайте, что результаты с 2016 года и до этого будут удалены из моей таблицы

Заранее спасибо

Ответы [ 2 ]

2 голосов
/ 05 апреля 2019

Это удалит все, у кого есть end_date с годом 2016 или старше:

DELETE FROM membership WHERE YEAR(end_date) <= YEAR(CURDATE() - INTERVAL 3 YEAR);

РЕДАКТИРОВАТЬ: Если вы хотите удалить все с датой окончания более 3 лет:

DELETE FROM membership WHERE end_date < NOW() - INTERVAL 3 YEAR; 
0 голосов
/ 05 апреля 2019

Некоторые примечания:

  • сравнивает пустой столбец 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 столбец, например:

SELECT m.* 
  FROM membership m 
 WHERE m.end_date < DATE(NOW()) + INTERVAL -4 YEAR
 ORDER BY m.end_date DESC

или если мы знаем, что нам нужно значение даты '2015-04-05' или '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.

...