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 для каждого куплета, возвращаемого запросом.
EDIT - спасибо за проверку, Крейг
РЕДАКТИРОВАТЬ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 () в примере); и
- количество итераций - где
предложение определяет 42 итерации в
Например, максимум с 3-значными таблицами составляет 1000 интервалов
... что означает, что мы можем использовать исходный sql, чтобы привести пример сверху, чтобы сгенерировать серию временных меток для каждой пары низших значений hival. Потерпи меня, этот 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 дней