删除和时间戳

t9eec4r0  于 2021-06-21  发布在  Mysql
关注(0)|答案(3)|浏览(304)

我在找一些关于mysql的帮助,很简单的问题,但真的伤了我的大脑一段时间。
我有一个名为“logs”的表,它有“date”的东西,也就是int(11)的timestamp,所以它使用timestamp actual。
我要做一个脚本,每分钟执行一个sql命令,检查所有行,如果“date”有超过/等于6个小时,我太累了,没有任何帮助。
有些命令我用过,但不起作用。

DELETE FROM logs WHERE date < UNIX_TIMESTAMP(DATE_SUB(NOW(), INTERVAL 6 HOUR));
DELETE FROM logs WHERE date < NOW() - INTERVAL 6 HOUR;

帮不上忙,所以,我在这里问你能不能帮我,谢谢。

c3frrgcw

c3frrgcw1#

日期“thing”称为列。列具有特定的数据类型。问题表明列是数据类型 INT(11) . 在该列中存储的是unix风格的32位整数,即自1970-01-01 utc以来的秒数。
如果这都是真的,那么第一个查询表单是合适的。右侧的表达式(小于比较的)返回整数秒数。
作为演示,请考虑以下表达式:

SELECT UNIX_TIMESTAMP( NOW() + INTERVAL -6 HOUR )   ==> 1528450555

或者,原作的写法

SELECT UNIX_TIMESTAMP(DATE_SUB(NOW(), INTERVAL 6 HOUR))

返回等效结果。
可以计算第二个查询,但是从datetime到numeric的自动转换将返回一个整数值,如 20180608153555 (即yyyymmddhhmmss),而不是从纪元开始的秒数。
考虑一个演示,在数值上下文中计算datetime dataytpe:

SELECT NOW() + INTERVAL -6 HOUR + 0  ==>  20180608153600

如果我们使用该表达式,将其与int(11)列进行比较,并删除int(11)列小于该值的所有行,它将删除表中该列中具有非null值的每一行。

7y4bm7vi

7y4bm7vi2#

你可以这样做:

DELETE FROM logs
WHERE FROM_UNIXTIME(date) < UNIX_TIMESTAMP(NOW() - INTERVAL 6 HOUR);
kgsdhlau

kgsdhlau3#

日期列的类型必须是timestamp而不是int,以便能够正确地相互比较时间戳,或者可以编写:

DELETE FROM logs WHERE FROM_UNIXTIME(date) < UNIX_TIMESTAMP(DATE_SUB(NOW(), INTERVAL 6 HOUR));

相关问题