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'
Тази заявка ще върне куплети, които можете да използвате, за да изберете липсващите данни. Липсващите данни ще имат времева марка между hival и loval за всеки куплет, върнат от заявката.
РЕДАКТИРАНЕ - благодаря за проверката, Крейг
РЕДАКТИРАНЕ2 :
получаване на липсващите времеви марки - този SQL става малко по-труден за четене, така че ще го разбия малко. Първо, имаме нужда от начин да изчислим поредица от стойности на времеви отпечатъци между дадена ниска стойност и висока стойност на интервали от 10 минути. Начин за това, когато не можете да създавате таблици, се основава на следния sql, който създава като резултат всички цифри от 0 до 9.
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
...сега като комбинираме тази таблица с нейно копие няколко пъти означава, че можем динамично да генерираме списък с определена дължина
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
... сега това парче sql се доближава до това, от което се нуждаем. Той има 2 входни променливи:
- начална дата (в примера използвах curdate()); и а
- брой итерации - клаузата where определя 42 итерации в примера, максимумът с 3 х цифрени таблици е 1000 интервала
... което означава, че можем да използваме оригиналния sql, за да управляваме примера отгоре, за да генерираме серия от времеви печати за всяка двойка hival lowval. Потърсете ме, този sql вече е малко дълъг...
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
...сега има малко епичен sql
ЗАБЕЛЕЖКА:използването на таблицата с цифри 3 пъти дава максимална празнина, която ще покрие от малко над 6 дни