2012-10-19 81 views
0

我正在致力於呼叫中心項目,我必須在特定時間範圍之間同時計算呼叫到達。 我必須寫具有參數的過程開始時間,結束時間和間隔TSQL中的日期範圍高級計數計算

例如:

Start Time: 11:00 
End Time: 12:00 
Interval: 20 minutes 

所以程序應該分割1小時的時間範圍爲3個部分,每個部分應算上抵達地,其開始,在此範圍內或來港定居人士,其開始結束,還沒說完呢

應該是這樣的:

11:00 - 11:20 15 calls at the same time(TimePeaks) 
11:20 - 11:40 21 calls ... 
11:40 - 12:00 8 calls ... 

任何建議如何計算它們?

+1

如果間隔不能整齊劃分開始時間和結束時間之間的時間段,您想要做什麼? (例如,上面的例子,但Interval = 13) - 其中一個間隔較短(第一個,最後一個?),或者您是否超出開始/結束以保持所有間隔的長度相同? –

+0

您是否會針對跨越多天的大量數據運行此操作,還是通常只針對一天運行?如果它每天都運行,但有大量的記錄,我想構建一個臨時表,其中包含間隔開始日期和結束日期,然後您在主查詢中加入的臨時表將是最有效的。 –

回答

2

您可以使用DATEADDGROUP BY您的時間跨度:

Select Count(*), DateAdd(Minute, @Interval * (DateDiff(Minute, 0, SomeDate)/@Interval), 0)As Part 
From #Temp 
Where SomeDate Between @StartTime And @EndTime 
Group By DateAdd(Minute, @Interval * (DateDiff(Minute, 0, SomeDate)/@Interval), 0) 
ORDER BY Part 

的樣本數據:

declare @StartTime datetime; 
declare @EndTime datetime; 
declare @Interval int; 
SET @StartTime = Convert(datetime,'2012-10-19 12:00:00',102); 
SET @EndTime = Convert(datetime,'2012-10-19 13:00:00',102); 
SET @Interval = 20; 

create table #Temp(SomeDate datetime); 
insert into #Temp values(Convert(datetime,'2012-10-19 12:05:00',102)); 
insert into #Temp values(Convert(datetime,'2012-10-19 12:06:00',102)); 
insert into #Temp values(Convert(datetime,'2012-10-19 12:15:00',102)); 
insert into #Temp values(Convert(datetime,'2012-10-19 12:25:00',102)); 
insert into #Temp values(Convert(datetime,'2012-10-19 12:45:00',102)); 
insert into #Temp values(Convert(datetime,'2012-10-19 12:35:00',102)); 
insert into #Temp values(Convert(datetime,'2012-10-19 12:37:20',102)); 
insert into #Temp values(Convert(datetime,'2012-10-19 12:15:00',102)); 
insert into #Temp values(Convert(datetime,'2012-10-19 12:55:00',102)); 
insert into #Temp values(Convert(datetime,'2012-10-19 12:18:10',102)); 

這裏有一個小提琴:http://sqlfiddle.com/#!3/ee6f9/1/0

+0

感謝您的回答,但那不是我想要的。讓我更詳細地解釋一下。開始時間和結束時間是不同的列。我想要在此時間範圍內開始和完成的記錄數或者已開始但尚未完成的記錄。我想要一份關於同時到達的電話的報告 – cihata87

1

看1小時前範圍:

DECLARE @iniz VARCHAR(16), @fine VARCHAR(16), @ades VARCHAR(16) 
SET @iniz = convert(varchar(16), dateadd(mi,-(60+(datepart(mi,getdate()))), getdate()),120) 
SET @fine = convert(varchar(16), dateadd(mi,-(datepart(mi,getdate())), getdate()),120) 
SET @ades = convert(varchar(16),Getdate(),120) 

PRINT @iniz + ' - ' + @fine + ' - ' + @ades