在MySQL中删除超过30分钟的行

时间:2014-05-10 19:53:06

标签: php mysql sql

在我的表mytable中。我有一个名为session_time (float)的列,其中我在添加行时以微秒为单位存储时间(我使用PHP函数microtime(true)来获取浮点数)。如何删除表格mytable中超过20分钟的所有行?

我已经尝试过这样的事情:

DELETE FROM mytable WHERE session_time < DATE_SUB(NOW(), INTERVAL 1800 SECOND)

但这会删除所有行!

4 个答案:

答案 0 :(得分:2)

更新中...

不应使用php microtime(true),而应使用MySQL函数NOW()。删除旧列,然后创建一个新列:

ALTER TABLE your_table ADD session_time DATETIME NOT NULL DEFAULT NOW();

现在当你添加一行时,它的session_time将自动设置为当前时间,你不需要为session_time插入任何值。

现在要删除超过30分钟的所有行,请使用:

DELETE FROM your_table WHERE TIMESTAMPDIFF(MINUTE,session_time,NOW()) > 30;

答案 1 :(得分:0)

尝试

DELETE FROM  myTABLE  WHERE session_time < (now() - interval 30 minute)

我没有测试它。我认为它应该也可以。

答案 2 :(得分:0)

PHP microtime()使用unix时间戳格式,而不是DATETIME格式。如果你存储这样的东西,你可以使用PHP来填充查询或使用MySQL的unix_timestamp() function

对于PHP,它将如此简单:

$query = 'DELETE FROM mytable WHERE session_time < '.time() - 1800;

我建议只在session_time上使用DATETIME格式,但是你应该利用MySQL的存储类型。

答案 3 :(得分:0)

听起来您正在将PHP中生成的微秒值与mysql中生成的时间戳值进行比较。这里有一些问题可能会出错,因为你可能实际上并不是时间比较,而是时间浮动,或者你的PHP应用程序使用的时钟与你的mysql不同。

由于您在SQL中进行比较,因此您应该根据SQL保存session_time值。这是默认值的好地方,例如:

mysql> create table mytable ( id int not null, session_time timestamp default now() );