Удаление записей, которым более 4 лет с сегодняшней даты в MySQL

#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 .