【问题标题】:Deleting records that are over 4 years old from today's date on MySQL删除 MySQL 上从今天开始超过 4 年的记录
【发布时间】:2019-08-27 14:34:45
【问题描述】:

当结束日期列超过当前日期超过 3 年时,我想从表中删除记录

我已经尝试过的内容见下文

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

我预计 2016 年及之前的结果会在我的表格中删除

提前致谢

【问题讨论】:

  • WHERE End_Date &lt; Date_Add(curdate(),Interval -4 Year) 删除今天之前 4 年的所有记录。

标签: mysql date intervals rowdeleting


【解决方案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; 

【讨论】:

  • @Gary Mannion:很高兴为您提供帮助!
  • 只是一个旁注;如果有大量数据,并且年份很重要;使用end_date &lt;= (calculated last day or datetime of desired year) 可能会更好。如果你在 end_date 上有一个索引,YEAR(end_date) 会阻止 MySQL 使用它。
  • 我没想到。这样做很容易实现:DELETE FROM membership WHERE end_date &lt; CONCAT(YEAR(CURDATE() - INTERVAL 2 YEAR), '-01-01');
【解决方案2】:

一些注意事项:

  • 将裸列 end_date 与值进行比较,作为日期类型
  • 在运行 DELETE 之前测试 SELECT 语句中的表达式

您要删除的行上大于 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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-22
    • 2020-12-01
    • 1970-01-01
    • 2016-06-03
    • 1970-01-01
    相关资源
    最近更新 更多