好像我的间隙检测只是拿起我设置的时间差,并以此为基础在每个间隔内进行。
因此,这是我的数据结构以及后续工作的解释:
我有一个像这样设置的数据库:
(Schema Name)
Historical
-CID int UQ AI NN
-ID Int PK
-Location Varchar(255)
-Status Varchar(255)
-Time datetime
我的数据看起来像这样(示例ID为5行)
433275 | 97 | MyLocation | OK | 2013-08-20 13:05:54
433275 | 97 | MyLocation | OK | 2013-08-20 13:00:54
433275 | 97 | MyLocation | OK | 2013-08-20 12:25:54
433275 | 97 | MyLocation | OK | 2013-08-20 12:20:54
433275 | 97 | MyLocation | OK | 2013-08-20 12:15:54
在上述情况下,您会注意到我丢失了ID为97的12:25:54-> 13:00的数据。我试图编写一个报告,告诉我:停机时间开始,停机时间,和停机时间结束(我一直在php中通过将timediff添加到Time中来进行处理)
这是我现在的代码(php-> mysql)(无法正常工作):
select *from (
SELECT
y.*,
TIMESTAMPDIFF(MINUTE, @prevDT, `Time`) AS timedifference,
@prevDT := `Time`
FROM ddHistorical y,
(SELECT @prevDT:=(SELECT MIN(`Time`) FROM ddHistorical)) vars
Where ID = '". mysql_real_escape_string($ID)."'
HAVING timedifference > 16
) s
order by Time desc
Limit 25";
最佳答案
您需要两个级别的子查询:
SELECT *
FROM (
SELECT y.*,
TIMESTAMPDIFF(MINUTE, @prevDT, `Time`) AS timedifference,
@prevDT := `Time`
FROM (SELECT *
FROM ddHistorical
WHERE ID = '97'
ORDER BY `Time`) y,
(SELECT @prevDT:=(SELECT MIN(`Time`) FROM ddHistorical)) vars) z
WHERE timedifference > 16
LIMIT 25
我实际上不确定为什么需要最外部的级别。我尝试没有它(即以
SELECT y.*
开头)并使用HAVING timedifference > 16
。由于某种原因,这报告了timedifference = 45
的一行。但是,如果我删除该HAVING
子句,它将显示所有行,报告的间隔为35分钟。通常,两者之间没有区别SELECT ... HAVING <cond>
和
SELECT * FROM (SELECT ...) WHERE <cond>
我不确定为什么该查询违反了规则-我怀疑它与用户变量有关。
编辑:
我想我已经弄清楚了为什么
HAVING
无法使用它。 MySQL显然会在计算出每一行的timedifference
列后立即评估该条件,并丢弃该行。当使用timedifference <= 16
时,它不会麻烦计算SELECT
子句中的其余列,因此它永远不会执行@prevDT := Time
。因此,直到超过该条件,它始终与MIN(Time)
进行比较。将
timedifference
检查移到外部查询中会强制其在过滤之前计算所有差异。SQLFIDDLE
关于php - MySQL:间隙检测查询未检测到间隙,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/18413654/