【问题标题】:Delete mysql record older than 30 days删除 30 天以上的 mysql 记录
【发布时间】:2012-03-16 09:41:48
【问题描述】:

如何删除超过30天的mysql记录?我的代码将删除所有记录,即使是昨天插入的。

require('../conn_db.php');
mysql_select_db("my_news",$conn);
mysql_query("SET NAMES utf8");
mysql_query("DELETE FROM my_news WHERE date < DATE_SUB(NOW(), INTERVAL 1 MONTH)");
mysql_close("my_news");

和mysql表

date int(10)
1321095600
1322107200
...
1328288400
1328290440

【问题讨论】:

  • 您显示的内容看起来不错,但根本不应该工作:它应该引发语法错误,因为date 是保留字。您确定您正在查看正确的查询
  • 使用SET NAMES 正是mysql_real_escape_string() 不安全的原因。请改用mysql_set_charset()
  • 使用int而不是date数据类型来存储日期有什么原因吗?
  • 您说的是“30 天”和“月”,这在大约 50% 的情况下是不一样的。你真的要删除数据吗?难道你不想在读取你的新闻项目的 SELECT 上执行这个 WHERE 子句吗?
  • 只有一个观察;有两种不同的方法,要么使用 PHP 提供的服务器时间,要么使用 mysql 提供的服务器时间。即使两者在同一台机器上,它们也可能彼此不同。

标签: php mysql sql-delete


【解决方案1】:

首先,如果您真的想删除超过 30 天的记录,请改用 INTERVAL 30 DAY,当您使用 INTERVAL 1 MONTH 时,您将删除在火星 31 日(即 4 月 1 日)添加的记录。

此外,您的日期列是 int 类型,并且 DATE_SUB() 将返回此格式 YYYY-MM-DD HH:MM:SS 的日期,因此它们不具有可比性。你可以这样做来解决这个问题:

DELETE FROM my_news WHERE date < UNIX_TIMESTAMP(DATE_SUB(NOW(), INTERVAL 30 DAY))

【讨论】:

  • 我想赞成这个只是因为它是第一个真正解释为什么 OP 的方法不起作用的答案,但是取一个时间戳,减去 30 天,对其进行格式化,然后将其转回时间戳实在是太笨重了。
  • 我同意,它很重而且很丑陋,但它解决了问题而无需 OP 更改他的表结构,并且它与他的初始查询相差不大。
【解决方案2】:

您的 MySQL 表不存储日期,而是一个 unix 时间戳(根据您提供的数据判断)。要删除,请执行以下操作:

mysql_query("DELETE FROM my_news WHERE date < ".strtotime('-1 month'));

【讨论】:

    【解决方案3】:

    试试这个。

    mysql_query("DELETE FROM my_news WHERE date < DATE_SUB(NOW(), INTERVAL 30 DAY)");
    

    【讨论】:

      【解决方案4】:

      您的 SQL 很好,但您混淆了数据类型。只需致电UNIX_TIMESTAMP(date)http://dev.mysql.com/doc/refman/5.5/en/date-and-time-functions.html#function_unix-timestamp

      require('../conn_db.php');
      mysql_select_db("my_news",$conn);
      mysql_query("SET NAMES utf8");
      mysql_query("DELETE FROM my_news WHERE date < UNIX_TIMESTAMP(DATE_SUB(NOW(), INTERVAL 1 MONTH))");
      mysql_close("my_news");
      

      【讨论】:

        【解决方案5】:

        这样做

         $time_ago = strtotime("-30 day");
         mysql_query("DELETE FROM my_news WHERE date < $time_ago");
        

        【讨论】:

          【解决方案6】:

          也许不是最漂亮的,但因为您似乎将时间存储为 int。从现在开始减去 30 天,然后与该值进行比较:

          DELETE 
          FROM my_news 
          WHERE `date` < (UNIX_TIMESTAMP() - (60 * 60 * 24 * 30))
          

          【讨论】:

            【解决方案7】:
            $expiretime = time() - 2592000; //1 * 60 * 60 * 24 * 30
            mysql_query("DELETE FROM my_news WHERE date < ".$expiretime);
            

            【讨论】:

              【解决方案8】:

              试试这个 sql 查询:

              DELETE FROM my_news WHERE DATEDIFF(NOW() ,date )>30;
              

              【讨论】:

                【解决方案9】:
                mysql_query("DELETE FROM my_news WHERE date < DATE_SUB(CURDATE(), INTERVAL 1 MONTH)");
                

                【讨论】:

                  【解决方案10】:

                  尝试在DATE_SUB()的第二个参数中使用date_interval_create_from_date_string('1 MONTH')而不是INTERVAL 1 MONTH。

                  【讨论】:

                    猜你喜欢
                    • 1970-01-01
                    • 1970-01-01
                    • 1970-01-01
                    • 1970-01-01
                    • 1970-01-01
                    • 1970-01-01
                    • 1970-01-01
                    • 2011-01-03
                    • 2019-08-27
                    相关资源
                    最近更新 更多