2012-12-04 92 views
0

我在表中有30000行,每10分钟有20列的时间戳。查找行之间的时间差

timestamp Col1 Col2 Col3 ... col20 

timestamp就像每隔10分钟一样。例如:18-05-2012 20:0718-05-2012 20:1718-05-2012 20:27

列有整数或浮点型数据。

我的问题是:我需要找到数据未被记录在列中的间隙和持续时间。假设列具有值,NULL,NULL,值,值,NULL。它有各自的时间戳。

我需要输出像NULL值和持续时间(开始时间 - 结束时间)的开始时间和结束时间。

+1

并执行'timestamp'列有什么数据类型? –

+0

时间戳记数据类型是日期时间(例如:18-05-2012 18:28 ) – Reyaz

回答

1

好吧,据我现在的理解,你想要在任何列没有记录的行之间的时间差,对不对?

然后有这样的尝试:

SELECT 
yt1.[timestamp] AS StartTime, 
MIN(yt2.[timestamp]) AS EndTime, 
DATEDIFF(s, yt1.[timestamp], MIN(yt2.[timestamp])) AS DifferenceInSeconds 
FROM 
yourTable yt1 
LEFT JOIN yt2 ON yt1.[timestamp] < yt2.[timestamp] 
WHERE 
yt1.Col1 IS NULL 
OR yt1.Col2 IS NULL 
... 
OR yt1.Col20 IS NULL 
OR yt2.Col1 IS NULL 
... 
OR yt2.Col20 IS NULL 
GROUP BY yt1.[timestamp] 

说实话,我不知道,如果这个工程,因为你没有提供的样本数据来了一下周围玩耍。

为了获得时差hh:mm:ss格式的搜索问题在stackoverflow,例如this one

+0

感谢您的回复,但我也需要时间戳记持续时间。例如,Col1不包含所有NULL值,在某些没有记录的地方,如果我们按照您的答案进行查询,我只会得到时间戳和Col Null值,但是我需要一个时间戳与第二个时间戳之间的持续时间,if值从2012年4月12日2:00到2012年4月12日2:40为空。我需要40分钟的时间差,以及空值的startime和endtime的时间戳。空值是随机的,它可以在任何行中。如果你不清楚,请让我知道。但是,真的会让你的回答更加明确 – Reyaz

+0

我试过上面的问题。但我得到错误的 – Reyaz

+0

我尝试了查询,选择 DATEDIFF(S,YT1。[时间戳],MAX(YT2。[时间戳])AS DifferenceInSeconds FROM EcstasyAggregateSignals YT1 LEFT JOIN YT2 ON YT1。[时间戳]> yt2。[timestamp] WHERE yt1.DBT IS NULL GROUP BY yt1。[timestamp]但是我收到错误信息156,Level 15,State 1,Line 2 关键字'AS'附近的语法不正确。 – Reyaz

0

我认为你应该使用2左联接:检测NULL外观开始,在共同我的回答看起来很像以前的答案:

select distinct max(table2.dt) as startTime, min(table3.dt) as endTime, 
datediff(minute, max(table2.dt), min(table3.dt)) as timeDifference 
from Table_2 table1 
left join Table_2 table2 on table2.dt < table1.dt 
left join Table_2 table3 on table3.dt > table1.dt 
where (table3.tt1 is not NULL and table3.tt2 is not NULL) 
    and (table2.tt1 is not NULL and table2.tt2 is not NULL) 
    and (table1.tt1 is NULL or table1.tt2 is NULL) 
    group by table1.dt, table1.id 
+0

感谢您的回复,我很困惑table2,table3 ..我只有一个表,请如果表名称是船舶和列是DBT,长。你能帮我重写查询吗?在此先感谢 – Reyaz

+0

和列名称作为时间戳 – Reyaz