Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使用datetime sql获取平均每5分钟的呼叫数_Sql_Sql Server_Qsqlquery - Fatal编程技术网

如何使用datetime sql获取平均每5分钟的呼叫数

如何使用datetime sql获取平均每5分钟的呼叫数,sql,sql-server,qsqlquery,Sql,Sql Server,Qsqlquery,我正在运行以下查询 select DateTime from Calls where DateTime > '17 Oct 2018 00:00:00.000' and DialedNumberID = '1234' 这会给我一个在特定日期拨打这个号码的所有时间的列表 基本上,我正在寻找的是一个查询,它将为我提供平均每X分钟发生一次的调用,并希望全年运行该查询 谢谢我猜您有一个名为Calls的表,其中包含DateTime和dialledNumberId列 您可以使用这种模式

我正在运行以下查询

select DateTime
from Calls
where DateTime > '17 Oct 2018 00:00:00.000' and
      DialedNumberID = '1234'
这会给我一个在特定日期拨打这个号码的所有时间的列表

基本上,我正在寻找的是一个查询,它将为我提供平均每X分钟发生一次的调用,并希望全年运行该查询


谢谢

我猜您有一个名为
Calls
的表,其中包含
DateTime
dialledNumberId

您可以使用这种模式每年汇总该表中的信息

  SELECT YEAR(`DateTime`),
         DialedNumberID,
         COUNT(*) call_count
    FROM Calls
   GROUP BY YEAR(`DateTime`), DialedNumberID
这种模式的诀窍是
按f(日期)
分组。函数
f()
将任何日期减少到发生日期的年份

按五分钟间隔汇总,您需要
f(date)
将日期戳缩短为五分钟间隔。这个函数比
YEAR()
复杂得多

例如,给定
2001-09-11 08:43:00
,这将返回
2001-09-11 08:40:00

这是你每隔五分钟的总结

  SELECT DATE_FORMAT(`DateTime`,'%Y-%m-%d %H:00')+INTERVAL(MINUTE(`DateTime`)-MINUTE(datestamp) MOD 5) interval_beginning,
         DialedNumberID,
         COUNT(*) call_count
    FROM Calls
   GROUP BY DATE_FORMAT(`DateTime`,'%Y-%m-%d %H:00')+INTERVAL(MINUTE(`DateTime`)-MINUTE(datestamp) MOD 5),
           DialedNumberID
通过为丑陋的
DATE\u FORMAT()。但这是另一天的话题

最后,追加

  WHERE YEAR(`DateTime`) = YEAR(NOW())
    AND DialedNumberID = '1234' 
按当前年份和特定id筛选的查询

此查询需要努力使其尽可能高效。这也是另一天的话题


Pro提示:
DATETIME
是MySQL中的保留字。列名通常不区分大小写。避免将列命名为与保留字相同的
DateTime

每个间隔的平均调用量是调用次数(
COUNT(*)
)除以监控时段开始和结束之间的分钟数(
TIMESTAMPDIFF(分钟,时段开始,时段结束)
)乘以所需间隔内的分钟数(示例中为五分钟)

对于MySQL:

select count(*) / timestampdiff(minute, date '2018-01-01', now()) * 5 as avg_calls
from calls
where `datetime` >= date '2018-01-01'
and dialednumberid = 1234;
对于SQL Server:

select count(*) * 1.0 / datediff(minute, '20180101', getdate()) * 5 as avg_calls
from calls
where [datetime] >= '20180101'
and dialednumberid = 1234;

结果会是怎样的呢?一个数字代表X分钟内的平均通话量?您被困在哪里?您面临的问题是什么?您需要我们提供答案?是的,只需要一个号码,但查询不起作用选择count(*)/timestampdiff(分钟,日期'2018-01-01',now())*5,因为平均通话时间为
DateTime
>=日期'2018-01-01',拨打的号码为1234;预期的输出是什么?当我为sql server寻找答案时,Apologies将其标记为mysql。。。因此,此查询似乎不适用于SQL Server。函数名为
DATEDIFF
NOW
GETDATE
,不支持ANSI日期文字,名称用括号括起来,整数除法超过小数。如何还可以获得每5分钟间隔的最大调用次数这有点困难。例如,如果我看1:00-1:05,1:05-1:10。。。我最多可以接到五个电话,但如果我看1:01-1:06,1:06-1:11。。。我可能会突然接到最多十个电话,或者只有两个电话。那么,您想如何定义五分钟的间隔?可能会查看每个记录/时间,并计算五分钟前发生的记录,从所有这些记录中取最大值。事实上,我只会在五分钟间隔内查看最大值
select count(*) * 1.0 / datediff(minute, '20180101', getdate()) * 5 as avg_calls
from calls
where [datetime] >= '20180101'
and dialednumberid = 1234;