select t1.ts as hival, t2.ts as loval
from metdata t1, metdata t2
where t2.ts = (select max(ts) from metdata t3
where t3.ts < t1.ts)
and not timediff(t1.ts, t2.ts) = '00:10:00'
Deze query retourneert coupletten die u kunt gebruiken om de ontbrekende gegevens te selecteren. De ontbrekende gegevens hebben een tijdstempel tussen hival en loval voor elk couplet dat door de query wordt geretourneerd.
EDIT - thx voor het controleren, Craig
EDIT2 :
de ontbrekende tijdstempels krijgen - deze SQL wordt een beetje moeilijker te lezen, dus ik zal het een beetje opsplitsen. Ten eerste hebben we een manier nodig om een reeks tijdstempelwaarden te berekenen tussen een bepaalde lage waarde en een hoge waarde in intervallen van 10 minuten. Een manier om dit te doen als u geen tabellen kunt maken, is gebaseerd op de volgende sql, die als resultaat alle cijfers van 0 tot 9 maakt.
select d1.* from
(select 1 as digit
union select 2
union select 3
union select 4
union select 5
union select 6
union select 7
union select 8
union select 9
union select 0
) as d1
...door deze tabel nu een paar keer te combineren met een kopie van zichzelf, kunnen we dynamisch een lijst met een opgegeven lengte genereren
select curdate() +
INTERVAL (d1.digit * 100 + d2.digit * 10 + d3.digit) * 10 MINUTE
as date
from (select 1 as digit
union select 2
union select 3
union select 4
union select 5
union select 6
union select 7
union select 8
union select 9
union select 0
) as d1
join
(select 1 as digit
union select 2
union select 3
union select 4
union select 5
union select 6
union select 7
union select 8
union select 9
union select 0
) as d2
join
(select 1 as digit
union select 2
union select 3
union select 4
union select 5
union select 6
union select 7
union select 8
union select 9
union select 0
) as d3
where (d1.digit * 100 + d2.digit * 10 + d3.digit) between 1 and 42
order by 1
... nu komt dit stukje sql in de buurt van wat we nodig hebben. Het heeft 2 invoervariabelen:
- een starttijdstempel (ik gebruiktecurdate() in het voorbeeld); en een
- aantal iteraties - de where-clausule specificeert 42 iteraties in het voorbeeld, maximum met 3 x cijfertabellen is 1000 intervallen
... wat betekent dat we de originele sql kunnen gebruiken om het bovenstaande voorbeeld aan te sturen om een reeks tijdstempels te genereren voor elk hival lowval-paar. Even geduld, deze sql is nu een beetje lang...
select daterange.loval + INTERVAL (d1.digit * 100 + d2.digit * 10 + d3.digit) * 10 MINUTE as date
from
(select t1.ts as hival, t2.ts as loval
from metdata t1, metdata t2
where t2.ts = (select max(ts) from metdata t3
where t3.ts < t1.ts)
and not timediff(t1.ts, t2.ts) = '00:10:00'
) as daterange
join
(select 1 as digit
union select 2
union select 3
union select 4
union select 5
union select 6
union select 7
union select 8
union select 9
union select 0
) as d1
join
(select 1 as digit
union select 2
union select 3
union select 4
union select 5
union select 6
union select 7
union select 8
union select 9
union select 0
) as d2
join
(select 1 as digit
union select 2
union select 3
union select 4
union select 5
union select 6
union select 7
union select 8
union select 9
union select 0
) as d3
where (d1.digit * 100 + d2.digit * 10 + d3.digit) between 1 and
round((time_to_sec(timediff(hival, loval))-600) /600)
order by 1
...nu is er een beetje epische sql
OPMERKING:als u de tabel met cijfers 3 keer gebruikt, krijgt u een maximale opening van iets meer dan 6 dagen