0

是否可以从同一字段中的时间戳计算时差?我的 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(,)不起作用,因为我需要两个参考点,而我只有一个。我在想象某种狡猾的子选择场景,但我不确定。

干杯!

4

1 回答 1

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

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

于 2013-08-02T11:17:35.373 回答