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'
Truy vấn này sẽ trả về các câu ghép bạn có thể sử dụng để chọn dữ liệu bị thiếu. Dữ liệu bị thiếu sẽ có dấu thời gian giữa hival và loval cho mỗi câu ghép được trả về bởi truy vấn.
EDIT - thx để kiểm tra, Craig
EDIT2:
nhận được dấu thời gian bị thiếu - SQL này khó đọc hơn một chút, vì vậy tôi sẽ chia nhỏ nó một chút. Đầu tiên, chúng ta cần một cách để tính toán một loạt các giá trị dấu thời gian giữa một giá trị thấp nhất định và một giá trị cao trong khoảng thời gian 10 phút. Một cách thực hiện điều này khi bạn không thể tạo bảng là dựa trên sql sau đây, sẽ tạo dưới dạng tập hợp tất cả các chữ số từ 0 đến 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
... bây giờ bằng cách kết hợp bảng này với một bản sao của chính nó một vài lần có nghĩa là chúng ta có thể tạo động một danh sách có độ dài được chỉ định
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
... bây giờ mảnh sql này đang tiến gần đến những gì chúng ta cần. Nó có 2 biến đầu vào:
- dấu thời gian bắt đầu (tôi đã sử dụngcurdate () trong ví dụ); và một
- số lần lặp - điều khoản chỉ định 42 lần lặp trong ví dụ, tối đa với bảng 3 chữ số x là 1000 khoảng thời gian
... có nghĩa là chúng ta có thể sử dụng sql gốc để điều khiển ví dụ từ trên xuống để tạo ra một loạt các dấu thời gian cho mỗi cặp hival lowval. Chịu đựng với tôi, sql này bây giờ hơi dài ...
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
... bây giờ có một chút kinh nghiệm về sql
LƯU Ý:việc sử dụng bảng chữ số 3 lần sẽ tạo ra khoảng cách tối đa mà nó sẽ bao gồm một chút trong hơn 6 ngày