[英]Getting minute difference between two timestamps in mysql using TIMESTAMPDIFF
[英]How to select Max(id) with the difference between two timestamp superior to five minute in Mysql?
我正在尝试在mysql的两个时间戳之间选择5分钟之差的Max('id')。
我的时间戳字段已sent
我做了
SELECT Max('id') FROM `mytable` WHERE TIMESTAMPDIFF(MINUTE, `sent`, NOW()) > 5
但这没有用。 它给我发送了空结果
这是我的表结构
CREATE TABLE IF NOT EXISTS `mytable` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`from_id` int(10) unsigned NOT NULL,
`to_id` int(10) unsigned NOT NULL,
`message` text NOT NULL,
`sent` int(10) unsigned NOT NULL DEFAULT '0',
`read_statu` tinyint(1) unsigned NOT NULL DEFAULT '0',
`is_deleted` int(11) NOT NULL DEFAULT '0',
PRIMARY KEY (`id`),
KEY `to` (`to_id`),
KEY `from` (`from_id`),
KEY `direction` (`is_deleted`),
KEY `read` (`read_statu`),
KEY `sent` (`sent`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=201 ;
INSERT INTO `mytable` (`id`, `from_id`, `to_id`, `message`, `sent`, `read_statu`, `is_deleted`) VALUES
(1, 1, 2, 'Juste un test pour moi meme', 1425729597, 1, 0),
(2, 2, 1, 'Hello', 1425729612, 1, 0),
(3, 2, 1, ' <3 (L) :prayer: :tkh: :heart: :-$ ', 1425729922, 1, 0),
(4, 2, 1, ' <3 (L) :prayer: :tkh: :heart: :-$ ', 1425729927, 1, 0),
(5, 1, 2, 'Ok', 1426010868, 0, 0);
请如何选择Max(id)与Mysql中两个时间戳之间的差异优于5分钟?
谢谢
id
应该用反引号而不是单引号引起来
SELECT Max(`id`) FROM `mytable` ...
通过在那里使用单引号,MySQL使用文字字符串'id'
代替列id
。
另外,您需要了解TIMESTAMPDIFF
不接受UNIX时间戳作为参数,而是接受有效的MySQL日期时间表达式。 给定两个日期时间表达式值,此函数用于返回类似时间戳的间隔值。
IMO,通过将sent
的数据存储为日期时间字段而不是Unix时间戳,可以极大地帮助自己。 如果您需要在现场进行任何计算/过滤等操作,Unix时间戳通常在MySQL表中是一个糟糕的设计决策。
假设您将更改sent
到datetime字段,则查询可能如下所示:
SELECT MAX(`id`)
FROM `myTable`
WHERE `sent` > DATESUB(NOW(), INTERVAL 5 MINUTE)
假设您要保留Unix时间戳字段格式,查询可能如下所示:
SELECT MAX(`id`)
FROM `myTable`
WHERE `sent` > UNIXTIMESTAMP(DATESUB(NOW(), INTERVAL 5 MINUTE))
您会看到您需要进行额外的转换才能与UNIX时间戳一起使用。
在此还要注意WHERE
子句的格式。 我没有像在查询中那样使用被过滤的字段作为计算的一部分。 您的方法将不允许对查询sent
使用索引。 通过将所有时间计算都保留在比较的一侧,从本质上讲,我们能够对整个查询进行一次datetime计算,然后使用sent
索引将每个行与该值进行比较。
要查看查询速度的这种差异,请运行上面给出的第二个查询(使用您当前使用的sent
时间戳),然后与下面的查询进行比较,这与您当前的方法类似:
SELECT MAX(`id`)
FROM `myTable`
WHERE TIMESTAMPDIFF(MINUTE, FROM_UNIXTIME(`sent`), NOW()) > 5
您应该在较大的表大小上看到明显的不同。
您可能要使用Max(id)和“ sent”代替Max('id')和“'sent'”
编辑:^ ---这是部分错误的,使用`id`和`sent`是有效的,但是'id'和'sent'是无效的
像这样:
SELECT Max(id) FROM `mytable` WHERE TIMESTAMPDIFF(MINUTE, sent, NOW()) > 5
编辑:问题是您已将“发送”存储为整数,为了与TIMESTAMPDIFF一起使用,您必须将其转换为DATE_TIME格式。 这是您可以执行的操作:
TIMESTAMPDIFF(MINUTE,FROM_UNIXTIME(sent),NOW())
最终结果:
SELECT Max(id) FROM `mytable` WHERE TIMESTAMPDIFF(MINUTE,FROM_UNIXTIME(sent),NOW()) > 5
一些额外的阅读: 在MySQL查询中将时间戳转换为日期
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.