2015-02-08 91 views
0

我有一个带有时间戳列Time的表“channel_001”,并且我将它分隔了10分钟。在mysql中查找空白时间

2013-01-01;00:10:04; 
2013-01-01;00:20:00; 
2013-01-01;00:30:02; 
2013-01-01;00:40:04; 

但是缺少数据。我如何检测缺少的行?然后在那里插入一行?!

例如:

2013-01-01;00:10:04; 
2013-01-01;00:20:00; 
2013-01-01;00:30:02 
2013-01-01;00:40:04; 
2013-01-01;01:00:02; 

那么这将是丢失:

2013-01-01;00:50:00; 

我想用表连接到自己的了,但是我在SQL新和太多的新手来单独回答答案。

任何想法?

+1

为什么缺少行?那分号是什么? – Strawberry 2015-02-08 14:23:05

+0

分号格式:分号文本。这些数据是个人应用程序消耗的有效功耗。有时候:当没有人在家时 - >没有数据被盗取。或者这是一个错误。 – Hase 2015-02-08 16:50:57

+0

但是,为什么你需要先检查? – Strawberry 2015-02-08 17:42:29

回答

0

可以发现,没有“下一个”时间像行:

select c.* 
from channel_001 c 
where not exists (select 1 
        from channel_001 c2 
        where c2.timestamp > c.timestamp + interval 9 minute and 
         c2.timestamp < c.timestamp + interval 11 minute 
       ); 

如果你的表是大(行几万),你可能会想使用的变量。以下代码获取上一个时间戳:

select c.*, 
     (case when (@tmp := @prevts) is null then null 
      when (@prevts := timestamp) is null then null 
      else @tmp 
     end) as prev_timestamp 
from channel_001 c cross join 
    (select @prevts := 0, @tmp := 0) vars 
order by timestamp; 

您可以将此作为子查询来获取超出范围的间隔。

+0

为了将数据分隔10分钟,我确实写了:选择DATE(time)作为Date,DATE_FORMAT(time,'%T')作为Time,avg(verbrauch)作为Watt from channel_007 where MONTH(time)='01' (时间)=“2014”组(时间)((60/10)*小时(时间)+平板(分钟(时间)/ 10)),MONTH(时间),DAY(时间)我如何加入这两个查询?谢谢 – Hase 2015-02-08 16:59:46