计算每分钟的日期间隔(跟踪每分钟的呼叫数)

时间:2016-10-04 09:01:56

标签: sql sql-server

使用SQL服务器(Azure) 我有我的StartCalls和EndCalls表(日期+时间)。 我想建立一个数字游戏,每分钟都会依靠拨打的电话数(跟踪每分钟的电话号码数)

我的解决方案应该基于我的CountTable

CountTable

MinutStart, 
MinuteEnd, 
Range(1 to 60), 
callsnumber

应该处理一小时内包含的所有会议记录

00:00:00-00:00:01 1 number, 
00:00:01-00:00:02 2 number, 
... 

Where ( StartCalls > MinutStart ) 
        and ( EndCalls < MinutEnd ) 
UPDATE Callsnumber = Callsnumber+1

希望有人能够解决这个问题并提供帮助^^

1 个答案:

答案 0 :(得分:0)

好吧,我宁愿去寻找观点。

先决条件: 创建一个Number表,它将存储从1到xxx的数字

请参阅示例MessageEvent

然而,想法是计算通话的持续时间。 然后你可以有一个起始分钟,并且在此结束时呼叫不是,你计算下一分钟并按数字递增。

当然,你制作模数60以避免&#34;小时溢出&#34;问题

你当然可以做些更好的事情,但是你已经有了这个想法。

with calls as( 
 select
  (datepart(minute, startDate) + number -1) % 60 as min1, 
  (datepart(minute, startDate) + number) % 60 as min2, 
  datediff(minute, startDate, endDate) as duration,
  number
 from <YourTable>
 join Numbers n on n.Number <= datediff(minute, startDate, endDate)
)
select 
  min1, 
  min2, 
  count(*) as nbOfCalls
from calls
group by min1, min2
order by min1, min2

修改

如果您需要年/月/小时/分钟的详细信息,您可以

创建一个包含所有分钟的日历表,在这种情况下从2016-06-01开始(在这种情况下以2024结尾)。

SELECT TOP 5000000 N=IDENTITY(INT, 1, 1)
INTO dbo.Numbers
FROM master.dbo.syscolumns a CROSS JOIN master.dbo.syscolumns  b;

ALTER TABLE dbo.Numbers ADD CONSTRAINT NBR_pk PRIMARY KEY(N);


select minutes = dateAdd(MINUTE, N, '2015-06-01')
into CalendarTable
from Numbers;

现在你可以做到

select  
  ct.minutes, 
  count(t.startDate) from 
CalendarTable ct
left join <yourTable> t on ct.minutes BETWEEN DATEADD(mi, DATEDIFF(mi, 0, t.startDate), 0) 
                  AND DATEADD(mi, DATEDIFF(mi, 0,t.EndDate), 0)
--where ct.minutes between '2016-10-03' and '2016-10-05' if you wanna test on an interval, put what you need here
group by minutes
order by minutes