【问题标题】:Deleting records older than a month/30 days删除超过一个月/30 天的记录
【发布时间】:2014-12-15 01:49:21
【问题描述】:

我有数据存储在 mysql 数据库中。我正在尝试删除所有超过 30 天的记录。所有记录都有一个指定记录的created_date 的字段。 created_date 的格式是 Mon, 08 Dec 2014 00:33:13 -0500。运行删除查询时,所有记录都被删除。即使是不超过 30 天的记录。我不确定这是否是由于日期在 created_date 字段中的格式。如何删除超过 30 天的记录?

try {
     $days = strtotime('1 month');
     $delete = $pdo->prepare("DELETE FROM archive WHERE created_date > :days");
            return $delete->execute(array('days' => $days));
        }catch (Exception $e) {
                      echo "Failed: " . $e->getMessage();
        }

表架构

+------------+-----------+-----+---------------+---------------------------------+
| First Name | Last Name | Age | Date of Birth |           created_date          |
+------------+-----------+-----+---------------+---------------------------------+
| Lionel     | Messi     |  27 | 6/24/1987     | Mon, 08 Dec 2014 00:33:13 -0500 |
| Michael    | Jordan    |  51 | 2/17/1963     | Tue, 15 Nov 2014 00:33:13 -0500 |
| Lebron     | James     |  30 | 12/30/1984    | Fri, 02 Oct 2014 00:33:13 -0500 |
+------------+-----------+-----+---------------+---------------------------------+

【问题讨论】:

  • DELETE FROM archive WHERE MONTH(created_date) < MONTH(NOW)) AND YEAR(created_date)<=YEAR(NOW())
  • @Hendry,这在本月的第一天可能效果不佳,它会在今天之前杀死所有东西:-)
  • :day'days'?还是:day'days' 是错字?编辑:是的,错字。
  • @Fred-ii- 这是一个错字,谢谢。现已更正。
  • 好的,不客气。你试过戈登的答案吗?

标签: php mysql


【解决方案1】:
DELETE FROM archive
WHERE STR_TO_DATE(SUBSTR(created_date, 0, 25), '%a, %d %b %Y %H:%i:%S') <
      DATE_SUB(NOW(), INTERVAL 30 DAY);

然后,您可以删除用于计算日期范围的 PHP 代码,让 MySQL 为您处理。

如果您可以控制数据库结构,将日期存储在 DATETIME 字段中会比在每个数据库行上调用 STR_TO_DATE 更有效。

【讨论】:

  • 我也试过了,但它根本没有删除任何东西。
  • 遵照您的建议更改为 DATETIME 字段。现在可以使用了。
【解决方案2】:

您的问题是 create_date 列是字符串而不是日期。您可以使用str_to_date() 将其转换为日期:

delete from archive
    where str_to_date(substr(created_date, 6), '%d %b %Y') > :days;

【讨论】:

  • 你从哪里得到 :day ??我在这里看不到一天的专栏..:o
  • @AvinashBabu 这就是 OP 在准备好的语句中设置为命名占位符的内容。是的,确实是一个错字。
  • ...这也是一个错字。 @Ghost 在 OP 的问题下查看我的评论。编辑:是的,错字。应该是:days
  • 它仍然会删除所有内容。这可能是$days = strtotime('1 month'); 的问题吗?
  • 它应该是 %b 而不是 %M,因为您的数据以缩写的月份名称存储。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-01-29
  • 1970-01-01
  • 2018-03-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-08-24
相关资源
最近更新 更多