2014-01-07 36 views
1

我有一個表格,其中包含從特定設備接收到的每個數據包的條目。該表具有帶時間戳(時鐘滴答)的一列,每半小時接收一次數據包。 我想統計丟失的數據包。用時間戳記數據丟失的數據包diff

我的做法是計算每個連續行的時間戳的差異,如果差異大於40分鐘,則遞增計數器。

但我不知道如何用sql查詢來做到這一點。

我正在使用MS Reporting Services 2008 R2來顯示丟失數據包的計數。

回答

1

我們不知道很多關於你的數據,但表示該表是這樣的:

create table ClockTick 
(
    packetTime datetime 
) 

insert into ClockTick select '01-Jan-2014 12:00' 
insert into ClockTick select '01-Jan-2014 12:30' 
insert into ClockTick select '01-Jan-2014 13:00' 
insert into ClockTick select '01-Jan-2014 14:00' 
insert into ClockTick select '01-Jan-2014 14:30' 
insert into ClockTick select '01-Jan-2014 15:30' 
insert into ClockTick select '01-Jan-2014 16:00' 
insert into ClockTick select '01-Jan-2014 17:00' 

可以得到所需要的結果,即,與像查詢:

with ticks as 
(
    select gapCounter = case 
    when datediff(minute, t.packetTime, g.packetTime) >= 40 then 1 
    else 0 
    end 
    from ClockTick t 
    cross apply (select top 1 g.packetTime 
       from ClockTick g 
       where t.packetTime < g.packetTime 
       order by g.packetTime) g 
) 
select lostPackets = sum(gapCounter) 
from ticks 

SQL Fiddle with demo

對於每一行,這是找到下一個接收到的數據包,然後將其添加到總數,如果差距> 40分鐘。

顯然你需要調整你的表/列。如果這沒有幫助,則需要提供一些示例數據和預期結果。

+0

謝謝!這真的很有幫助。該表有一列名爲「時間戳」,是一個64位整數字段。該值從System :: DateTime對象中獲取,並調用方法Ticks(http://msdn.microsoft.com/zh-cn/library/system.datetime.ticks(v=vs.90).aspx?cs-保存琅= 1&CS琅= CPP#代碼片斷-1)。 我想我必須將int ticks轉換爲datetime,所以我可以像你一樣使用datediff。 –

+0

不客氣!您可以將查詢調整爲'... when g。[timestamp] - t。[timestamp]> = 24000000000 then 1 else 0 ...',即24000000000個滴答的差值爲40分鐘(我認爲;算術可能是錯誤的),如果你不想在你的桌子上玩耍。 –

+0

我做到了!非常感謝! –