【问题标题】:Deleting all rows older than 5 days删除所有超过 5 天的行
【发布时间】: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

【问题讨论】:

    标签: php mysql sql


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

    【讨论】:

      猜你喜欢
      • 2018-08-24
      • 1970-01-01
      • 2012-05-06
      • 1970-01-01
      • 1970-01-01
      • 2016-09-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多