2012-03-16 153 views
4

如何刪除超過30天的mysql記錄?我的代碼將刪除所有記錄,甚至是昨天插入的記錄。刪除30天以前的mysql記錄

require('../conn_db.php'); 
mysql_select_db("my_news",$conn); 
mysql_query("SET NAMES utf8"); 
mysql_query("DELETE FROM my_news WHERE date < DATE_SUB(NOW(), INTERVAL 1 MONTH)"); 
mysql_close("my_news"); 

和MySQL表

date int(10) 
95600 
1322107200 
... 
1328288400 
1328290440 
+0

告訴你什麼看起來不錯,但不應該在所有的工作:因爲'date'是保留字應該拋出一個語法錯誤。你確定你正在查詢正確的查詢 – 2012-03-16 09:46:03

+0

使用'SET NAMES'正是爲什麼'mysql_real_escape_string()'不安全。改用['mysql_set_charset()'](http://php.net/manual/en/function.mysql-set-charset.php)。 – DaveRandom 2012-03-16 09:47:10

+0

是否有理由使用int而不是date數據類型來存儲日期? – JJJ 2012-03-16 09:47:41

回答

1

你的MySQL表沒有存儲的日期,而是一個UNIX時間戳(從您提供的數據來看)。要刪除請執行以下操作:

mysql_query("DELETE FROM my_news WHERE date < ".strtotime('-1 month')); 
1

也許不是最漂亮的,但因爲你似乎你的時間存儲爲一個int。如何只減去從現在起30天,並比較該值:

DELETE 
FROM my_news 
WHERE `date` < (UNIX_TIMESTAMP() - (60 * 60 * 24 * 30)) 
1

做到像

$time_ago = strtotime("-30 day"); 
mysql_query("DELETE FROM my_news WHERE date < $time_ago"); 
0

試試這個sql查詢:在第二

DELETE FROM my_news WHERE DATEDIFF(NOW() ,date)>30; 
1
$expiretime = time() - 2592000; //1 * 60 * 60 * 24 * 30 
mysql_query("DELETE FROM my_news WHERE date < ".$expiretime); 
0

嘗試使用date_interval_create_from_date_string('1 MONTH'),而不是間隔1個月參數DATE_SUB()

5

首先,如果您確實想刪除超過30天的記錄,請改爲使用INTERVAL 30 DAY,當您使用INTERVAL 1 MONTH時,您將刪除在火星31日(4月1日)添加的記錄。

此外,您的日期欄類型爲int,並且DATE_SUB()將以此格式YYYY-MM-DD HH:MM:SS返回一個日期,因此它們不具有可比性。你可以這樣做來解決這個問題:

DELETE FROM my_news WHERE date < UNIX_TIMESTAMP(DATE_SUB(NOW(), INTERVAL 30 DAY)) 
+0

我想upvote這只是因爲它是第一個實際解釋爲什麼OP的方法不起作用的答案,但採取時間戳,減少30天,格式化,然後將其重新回到時間戳只是太笨重了。 – JJJ 2012-03-16 09:52:35

+0

我同意,它很沉重,很醜,但它解決了問題,而OP沒有改變他的表結構,並且不會偏離他最初的查詢。 – professorsloth 2012-03-16 09:56:45

2

試試這個。

mysql_query("DELETE FROM my_news WHERE date < DATE_SUB(NOW(), INTERVAL 30 DAY)"); 
-1
mysql_query("DELETE FROM my_news WHERE date < DATE_SUB(CURDATE(), INTERVAL 1 MONTH)");