【问题标题】:counting lost packets with timestamp diff使用时间戳差异计算丢失的数据包
【发布时间】:2014-01-08 05:58:40
【问题描述】:

我有一个表,其中包含我从特定设备收到的每个数据包的条目。该表有一列带有时间戳(时钟滴答),每个数据包每半小时接收一次。 我要统计丢失的数据包。

我的方法是计算每个连续行上时间戳的差值,如果差值大于 40 分钟,则增加一个计数器。

但我不知道如何使用 sql 查询来做到这一点。

我正在使用 MS Reporting Services 2008 R2 来显示丢失数据包的计数。

【问题讨论】:

    标签: sql reporting-services ssrs-2008


    【解决方案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'
    

    您可以通过如下查询获得所需的结果,即 3

    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 分钟,则将其添加到总数中。

    显然,您需要针对表格/列进行调整。如果这没有帮助,您需要提供一些示例数据和您的预期结果。

    【讨论】:

    • 谢谢!这真的很有帮助。该表有一列名为“Timestamp”,是一个 64 位整数字段。该值是从 System::DateTime 对象中获取的,调用方法 Ticks (msdn.microsoft.com/en-us/library/…)。我想我必须将 int 刻度转换为 datetime,这样我才能像你一样使用 datediff。
    • 不客气!您可以将查询调整为类似于 ...when g.[timestamp] - t.[timestamp] &gt;= 24000000000 then 1 else 0...,即 24000000000 滴答声的差异是 40 分钟(我认为;算术可能是错误的),如果您不想乱搞表格。
    • 我做到了!非常感谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-04
    • 2013-05-21
    • 2020-05-13
    相关资源
    最近更新 更多