我想删除过期的数据。
我有两栏:
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() . "' ");
但不幸的是,没有像我预期的那样工作。
修改
这是行
的结果
修改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 :(得分: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()
的所有行。