两个日期时间之间的数据

时间:2012-09-14 20:34:35

标签: sql sql-server-2008 datetime

我正在努力解决这个问题。我甚至不知道如何问这个问题。我想得到同一时间内发生的呼叫的峰值计数。

我尝试将日期范围分解为几分钟(导致一个巨大的数据集),并获得在这些时间内发生的呼叫计数,但计数已关闭(我被关闭了10倍),因为我知道总电话。

1 | 2012-01-01 01:15:00.000 | 2012-01-01 01:16:00.000
2 | 2012-01-01 01:14:00.000 | 2012-01-01 01:17:00.000
3 | 2012-01-01 01:18:00.000 | 2012-01-01 01:20:00.000

在第一次呼叫日期时间范围内,发生了2次呼叫(本身和号码2)。与2.相同。呼叫3在该日期时间范围内没有发生呼叫。这是非常简化的,因为我们讨论的是全天的日期时间范围,可能只有几分钟或几秒钟。我需要找到每月的高峰期。所以对于这个例子,1月的峰值为2(我不需要知道确定数字的日期范围)

1 个答案:

答案 0 :(得分:1)

这是我的首选方式。它以呼叫开始或停止时的所有时间列表开始,然后计算同时呼叫的数量:

with t as (
     select starttime as thetime, 1 as isstart, 0 as isend
     from calls
     union all
     select endtime, 0 as isstart, 1 as issend
     from calls
   ),
   t2 as (
     select thetime, row_number() over (order by thetime) as numcalls,
            isstart, isend,
            row_number() over (partition by isstart order by thetime) as cumstartsorends
     from t
    ),
   t3 as (
     select thetime,
            (case when isstart = 1 then cumstartsorends
                  else numcalls - cumstartsorends
             end) as numstarts,
            (case when isend = 1 then cumstartsorends
                  else numcalls - cumstartsorends
             end) as numends
      from t2
     )
select year(thetime) as yr, month(thetime) as mon,
       max(numstarts - numends) as maxcum
from t3
group by year(thetime), month(thetime)

此查询真正想要做的是每次(开始时间或结束时间)的累积总和。但是,直到2012年才支持。

所以,它确实是一招。它计算累计启动和停止次数。但是,这些仅在开始时间或结束时间记录中。要获取其他值,它还会计算总起点和终点数,并减去此值。因此,每个时间戳都有累计启动和停止次数。差异是并发呼叫的数量。