2010-08-08 50 views
41

我的表中有一个时间戳字段。如何删除10分钟以前的记录?MySQL:删除所有超过10分钟的行

尝试这样:

DELETE FROM locks WHERE time_created < DATE_SUB(CURRENT_TIME(), INTERVAL 10 MINUTE) 

没有工作。我究竟做错了什么?

编辑:我用这个代码:

SELECT time_created, CURRENT_TIMESTAMP, TIMESTAMPDIFF(MINUTE, time_created, CURRENT_TIMESTAMP) FROM locks 

但奇怪的是,这给了错误的结果太

time_created   CURRENT_TIMESTAMP  TIMESTAMPDIFF(MINUTE, time_created,  CURRENT_TIMESTAMP) 
2010-08-01 11:22:29 2010-08-08 12:00:48 10118 
2010-08-01 11:23:03 2010-08-08 12:00:48 10117
+2

什么是您的字段类型? – zneak 2010-08-08 07:30:00

+0

id [int(11)],time_created [timestamp] – HyderA 2010-08-08 07:31:44

+0

'SELECT DATE_SUB(CURRENT_TIME(),INTERVAL 10 MINUTE)'返回你期望的结果吗?如果没有,请检查服务器时间。 – Oded 2010-08-08 07:33:41

回答

106

如果TIME_CREATED是UNIX时间戳(INT),你应该能够使用像这样:

DELETE FROM locks WHERE time_created < (UNIX_TIMESTAMP() - 600); 

(600秒= 10分钟 - 显然)

否则(如果TIME_CREATED是MySQL的时间戳),你可以试试这个:

DELETE FROM locks WHERE time_created < (NOW() - INTERVAL 10 MINUTE) 
+0

不知道这是否正常,UNIX_TIMESTAMP()输出数量,我猜测以毫秒为单位,time_create [timestamp]字段显示时间为2010-08-01 11:22:29 – HyderA 2010-08-08 07:46:07

+0

第二个代码也不起作用。 – HyderA 2010-08-08 08:00:21

+0

嗯...尝试'从锁中SELECT time_created,(NOW() - INTERVAL 10 MINUTE),DATE_SUB(CURRENT_TIME(),INTERVAL 10 MINUTE);'它们中的任何一个是否提供可比较的结果?在我的经验中,中间会给你一个MySQL时间戳,而最后一个返回NULL。 – 2010-08-08 08:25:16

20

的答案是正确的MYSQL manual itself

"DELETE FROM `table_name` WHERE `time_col` < ADDDATE(NOW(), INTERVAL -1 HOUR)" 
+1

这应该是被接受的答案! – plocks 2016-03-31 08:49:03

+0

类似的答案是正确的数量和替代方案。猜猜正确和最好的答案是不同的 – zardilior 2016-07-21 19:29:08

+1

“INTERVAL -1HOUR”应该是“INTERVAL -1 HOUR” – Sofox 2017-02-14 18:55:09