2014-04-10 25 views
0

我想删除过期的数据。如何从数据库中删除过期的数据(取决于期间列)

我有两列:
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]"); 
    } 
} 

以前的代码正常工作,因为我想要的。
问题是前面的代码会发生更多的服务器负载。
我想要一个查询做,因为以前的代码没有使用条件。

+0

DELETE FROM content WHERE created_time +(period * $ twentyFour)

+0

无法正常工作。 –

+0

请定义“不起作用” - 缺乏细节是如此无益。请注意,在问题中您指出该字段是时间戳,但图像(不确定它应该表示什么)使用日期。请给出删除/未删除记录的具体例子。 – AD7six

回答

0

我可以建议你编辑你的数据结构并包含一个新的列delete_time

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


假设period你的POST数据表明天数的数值来保存数据,delete_time

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

这种方式来计算,你修枝/删除查询可以只是一个班轮:

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

该查询删除其delete_time超过了当前所有行。

+1

我认为这不是坏主意谢谢,如果我没有找到另一种替代解决方案,我会使用它,我会给你的答案作为最好的答案。 –

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

“期限”的价值如何? “周期”是决定数据库中的行的时间段。 –

+0

我需要你来解释究竟扮演了什么角色,因为我不太确定它会如何影响你在这里做的事情。基本上,我不知道什么“数据库中保持行的时间段”意味着 –

+0

例如: 我想添加新的广告,有一个下拉菜单来确定显示广告的时间段,(3天,7天天,15天,30天)。例如,我将从下拉菜单中选择7天,然后单击插入按钮将数据存储在数据库中。 'created_time'列将通过使用time()函数存储时间,'period'列将存储下拉菜单的值,在这种情况下将存储7,因为我已经选择了7天。而已 。我希望你能理解我。 –

0

见EDIT2:这个问题的

鉴于时间举行UNIX时间戳,这是需要什么:

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

这里是:SQLFiddle

我忘记了在SQL中使用日期和时间玩的乐趣不多; -/

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

如果使用 '真' 日期时间,然后列,这是要走的路:

用途:

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给出了正确的答案。

+0

演示[链接](http://sqlfiddle.com/#!2/2a374/2/0) –

+0

@Lion King,我应该添加tl; dr在我的答案开头:-) –

+0

注意:'' created_time'的值是UNIXTIME,就像这个'1395912075' - >返回的'time()'函数的值。 'created_time'列的类型是'INT'而不是'datetime'。 –

相关问题