2014-04-10 24 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'。 –

相關問題