Mysql计算同一字段中时间戳之间的时差?

时间:2013-08-02 10:31:36

标签: mysql timestamp

是否可以计算同一字段中时间戳的时差?我的SQL知识还不错,但我无法弄清楚如何在同一张桌子上做这样的事情。

ID, SENSOR, COUNT, TIMESTAMP
'1461630', '1', '91', '2013-08-02 09:14:30'
'1461629', '1', '92', '2013-08-02 09:13:29'
'1461628', '1', '92', '2013-08-02 09:12:27'
'1461627', '1', '91', '2013-08-02 09:11:26'
'1461626', '1', '91', '2013-08-02 09:10:24'
'1461625', '1', '7', '2013-08-02 09:03:14'
'1461624', '1', '13', '2013-08-02 09:02:12'
'1461623', '1', '13', '2013-08-02 09:01:11'
'1461622', '1', '7', '2013-08-02 09:00:09'
'1461621', '1', '3', '2013-08-02 08:58:06'

我需要做的是显示一个带有UP和Down时间值的饼图。我只有1个表可供参考,所以只需要上面的时间戳,它就必须是每分钟一次。

具体而言,在以下时间内,机器未运行约7分钟。这是我需要弄清楚的7分钟。

'1461626', '1', '91', '2013-08-02 09:10:24'
'1461625', '1', '7', '2013-08-02 09:03:14'

这可能吗?或者我真的需要一个单独的表中的逐个帐户吗?显然,我宁愿不创建更多的表,因为我正在使用的设备非常有限,而且将这些数据报告给我运行的tcp服务器已经非常受欢迎了。

显然TIMESTAMPDIFF(,)不起作用,因为我需要两个参考点,而我只有一个参考点。我想象某种狡猾的子选择场景,但我不确定。

干杯!

1 个答案:

答案 0 :(得分:2)

您可以自行加入表格,这样的情况适用于您的情况:

SELECT 
*
FROM
yourTable a
INNER JOIN yourTable b ON a.ID = b.ID + 1
WHERE TIMESTAMPDIFF(second, a.timestamp, b.timestamp) > 60

但是当您的ID列中存在空白时,这会变得很难看。尤其是当你拥有* 批次的数据时,它会变得很丑陋(就性能而言(当你表上没有好的索引时))。

所以,我建议使用变量进行更高级的查询。无需将表连接到自身,这通常运行得非常快:

SELECT * FROM (
SELECT
yt.*,
TIMESTAMPDIFF(second, @prevTS, `timestamp`) AS timedifference,
@prevTS:=yt.`timestamp`
FROM
yourTable yt
, (SELECT @prevTS:=(SELECT MIN(`timestamp`) FROM yourTable)) vars
ORDER BY ID
)subquery_alias
WHERE timedifference > 65

要进一步改进此查询以显示时差过大的两行应该不是问题:)当您遇到严重问题时,请随时询问。