如何从数据库中删除过期数据(取决于句点列)

时间:2014-04-10 13:24:35

标签: php mysql sql date

我想删除过期的数据。

我有两栏:
created_time:其中包含一个表示time()函数(ex: 1395836716)的值 period:包含数据库(ex: 3 or 7 or 15 or 30 per day)中剩余行的周期。

我想创建一个查询来检查表中的所有行,以了解过期的行 问题是我不知道该怎么做,但我试过了。

$twentyFour = 60 * 60 * 24;
mysql_query("DELETE FROM content WHERE created_time + (period * $twentyFour ) > '" . time() . "' ");

但不幸的是,没有像我预期的那样工作。


修改

这是行

的结果

enter image description here


修改2

我是通过使用php条件做到的:

$twentyFour = 60 * 60 * 24;
$query = mysql_query("SELECT * FROM content");
while ($data = mysql_fetch_assoc($query)) {
    if ($data['created_time'] + ($data['period'] * $twentyFour) < time()) {
        mysql_query("DELETE FROM content WHERE id = $data[id]");
    }
}

以前的代码可以正常工作。
问题是以前的代码会发生更多的服务器负载 我想要一个查询,就像前面的代码一样,不使用条件。

3 个答案:

答案 0 :(得分:2)

DELETE FROM content 
WHERE created_time < DATE_ADD(NOW(), INTERVAL `period` DAY)

答案 1 :(得分:0)

参见问题2的编辑

鉴于时间被保存为unix时间戳,这就是所需要的:

 DELETE FROM content 
 WHERE (created_time + period * 60 * 60 * 24) <= NOW()

这是: SQLFiddle

我忘记了在SQL中玩日期和时间有多么有趣; - /

----------------------------------------

如果使用'real' DateTime 列,那么这就是要走的路:

使用:

 DELETE FROM content 
 WHERE created_time < DATE_SUB(NOW(), INTERVAL `period` DAY)

或:

DELETE from content
WHERE NOW() > DATE_ADD(`created_time`, INTERVAL `period` DAY)

日期和日期差异总是难以正确。问题是你需要选择一个参考点:

1) NOW() against created_at + interval, 
2) NOW() against  `expiry_date
3) created_at + interval against NOW()
4) expiry_date against NOW().

当您尝试解决问题时,您倾向于切换参考点,这非常不直观。

我创建了一个演示所有计算的SQL小提琴。 'created_at'日期始终是午夜,以“简化”检查。您可以更改名为“is_now”的变量,并查看所有日期差异和布尔结果的结果。这可能是“有趣的”。

TL; DR

SQLFiddle 给出了正确答案。

答案 2 :(得分:0)

我建议您修改数据结构并添加新列delete_time吗?

delete_time应包含从您的给定period计算应删除列的UNIX时间戳。


假设period的POST数据是表示保存数据的天数的数值,delete_time应按

计算
$delete_time = time() + $_POST['period']*24*60*60;

这样,您的修剪/删除查询可以只是一行:

mysql_query("DELETE FROM content WHERE delete_time < ".time());

该查询会删除delete_time已通过当前time()的所有行。