【问题标题】:MySQL Delete Records Older Than X Minutes?MySQL删除超过X分钟的记录?
【发布时间】:2012-06-30 10:46:38
【问题描述】:

我进行了相当多的搜索,发现了一些最终对我不起作用并且无法理解原因的解决方案。

我有一个带有时间戳列的表。此列的 MySQL 类型是“日期时间”。我从 PHP 中将以下内容插入到此表中。

date('Y-m-d H:i:s')

这里输入的是 MySQL 日期时间的正确值。

2012-06-28 15:31:46

我想使用此列删除早于 10 分钟的行。我正在运行以下查询,但它不起作用。它影响 0 行。

DELETE FROM adminLoginLog WHERE timestamp < (NOW() - INTERVAL 10 MINUTE);

谁能解释我做错了什么以及为什么它不能正常工作?

谢谢。

【问题讨论】:

  • 试试我的更新 1 答案,让我知道你得到了什么......
  • @FahimParkar 谢谢。我刚刚尝试过,但没有奏效。非常感谢。

标签: php mysql sql


【解决方案1】:

由于 TIMESTAMP() 是返回当前时间戳的内置函数,因此您的查询将永远不会返回任何结果。

尝试将列用反引号括起来,让 MySQL 知道您的意思是该列,而不是保留字:

DELETE FROM adminLoginLog WHERE `timestamp` < (NOW() - INTERVAL 10 MINUTE);

【讨论】:

  • 有趣。我完全没有想到,谢谢。但是查询仍然影响 0 行,并且应该删除很多行。但是,鉴于此,我将返回并尝试我在网上找到的其他一些查询,并确保将列名包含在反引号中。
  • @sajanNOPPIX,我用反引号测试了你的查询,它似乎对我有用。你有什么问题?您可能想检查您的数据。时区问题?
  • 我认为问题可能是我应该在 MySQL 中使用 TIMESTAMP 时使用 DATETIME 数据类型。我正在更新我的数据库并使用它添加一些新记录,稍后会尝试一下。非常感谢。
  • @sajanNOPPIX, NOW() 适用于 TIMESTAMP 或 DATETIME 列。 MySQL 进行转换。问题出在其他地方。
【解决方案2】:

timestamp 是 mysql 中的保留关键字。要将timestamp 用作字段名称,您必须将其放在反引号中,如下所示。

`timestamp`

如果 time_created 是 unix 时间戳 (int),您应该可以使用如下内容:

DELETE FROM adminLoginLog WHERE `timestamp` < (UNIX_TIMESTAMP() - 600);

(600 秒 = 10 分钟 - 显然)

否则(如果 time_created 是 mysql 时间戳),你可以试试这个:

DELETE FROM adminLoginLog WHERE `timestamp` < (NOW() - INTERVAL 10 MINUTE)

更新 1

DELETE FROM adminLoginLog WHERE `timestamp` < DATE_SUB( CURRENT_TIME(), INTERVAL 10 MINUTE)

更新 2

DELETE FROM adminLoginLog WHERE `timestamp` < DATE_SUB( NOW(), INTERVAL 10 MINUTE)

Demo

【讨论】:

  • 谢谢。您的原始答案实际上帮助我弄清楚了。我的专栏使用的是 DATETIME 数据类型,它似乎不支持像 NOW() 这样的函数。我将它切换到 TIMESTAMP 数据类型,一切都开始工作了。
  • @sajanNOPPIX:太好了。还将字段名称 timestamp 重命名为其他名称...例如myDate 或 timeEntered...
  • @sajanNOPPIX :使用日期时间,现在可以工作,但是需要DATE_SUB
【解决方案3】:

我会在 php 中生成时间戳,然后将其传递给您的 mysql 查询:

$date = new DateTime();
$date->modify("-10 minutes")

【讨论】:

    【解决方案4】:

    您的查询是正确的,如果您有权访问 phpmyadmin,请在 SQL 控制台中执行该命令,该命令将为您提供更多信息。

    【讨论】:

      【解决方案5】:

      PHP 代码:

      //Your Database Details
      
      $conn = mysqli_connect("localhost","root","","tifu");
      
      //Actual Core thing
      
      $delete_otp = mysqli_query($conn,"DELETE FROM temp_project_member_details WHERE create_at < ('" . date("Y-m-d H:i:s"). "' - INTERVAL 10 MINUTE)"); 
      

      注意: 这里 temp_project_member_details : 数据库tifu中的表名

      和 create_at :表 temp_project_member_details 中的字段名称,其中使用相同的函数 '" . date("Y-m-d H:i:s"). "' 存储日期和时间

      Screenshot of Deleting After 10 minute code

      Screenshot of the storage of Date and Time in the create_at field of table as described in answer

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-07-19
        • 1970-01-01
        • 1970-01-01
        • 2011-03-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-09-19
        相关资源
        最近更新 更多