删除所有超过 5 天的行

Posted

技术标签:

【中文标题】删除所有超过 5 天的行【英文标题】:Deleting all rows older than 5 days 【发布时间】:2011-05-02 04:49:56 【问题描述】:

我想删除表中所有超过 5 天的行。

我的表有一个日期类型的 createdOn 列,你能建议我查询吗?

我正在使用 mysql 数据库

现在我写了以下查询

SELECT * from `user_games` where created_on >= DATE_SUB(created_on, INTERVAL 5 DAY)

查看 5 天前的 user_games

但即使我对 Invterval 1 Day 或 Interval 5 day 运行查询,我总是得到相同的结果

而今天的日期是 2011-5-2

【问题讨论】:

【参考方案1】:

试试这个,

delete from mytable where datediff(now(), mytable.date) > 5

这是删除的正确方法。

【讨论】:

运行速度比 Harry Joy 下面的答案快得多,不知道为什么。 @iautomation 我猜这更有效,因为 datediff() 只考虑日期,而 DATE_SUB() 也考虑时间。 抱歉回复我自己,但请注意:DATEDIFF('2007-12-31 00:00:01','2007-12-30 23:59:59') = 1 day while DATE_SUB('2007-12-31 00:00:01','2007-12-30 23:59:59') = 2 秒。【参考方案2】:

使用date_sub 函数如:

delete from `myTable` where createdOn<DATE_SUB(curdate(), INTERVAL 5 DAY);

【讨论】:

SELECT * 应该是DELETE @bdares:是的,我知道我只是在更新它。 我没有得到想要的结果,我试图通过使用 select 而不是 delete 来查看数据,只是想看看想要的行是否被查询选中,但我没有得到正确的结果 +1:如果createdon 列上存在索引,则可以使用索引 嘿,它工作不正常,一旦我看到我认为的查询,是的,我现在得到了正确的 sql 代码,但是当我运行它时,总是返回相同的结果,我已经更新了我的结果质疑 sanjay 给出的查询,发现它工作得很好,我也对三个不同查询的这种行为感到惊讶【参考方案3】:

你想这样做:

delete from myTable 
where createdOn < CurDate() - 5

【讨论】:

+1 添加的内容符合标准并且比DATE_SUB imho 更易于阅读:) 这行不通,我之前尝试过,currdate-5 返回一些整数,该整数依次删除每 2 天的旧行,这会导致问题。 这很有趣,一直和我一起工作。那是createdOn 的数据类型? ya Adrian 我明白这是你的意见,我通过运行查询我告诉你找到了,我通过 Sanjay 给出的查询得到了想要的结果。这不是几分的问题,但更重要的是,如果我们发现了一个新事物/概念/逻辑,那就更好了。 +1:如果createdon 列上存在索引,则可以使用索引【参考方案4】:

DELETE FROM table_name WHERE time

【讨论】:

以上是关于删除所有超过 5 天的行的主要内容,如果未能解决你的问题,请参考以下文章

MySQL 版本 5.5.37:使用 CURSOR 删除超过 30 天的表

删除列中超过 30 天的所有行的过程

删除超过 7 天的文件

删除超过5天的文件

当“参数列表太长”时如何删除所有超过 3 天的文件?

删除所有超过30天的文件