如何使用DateTime SQL每5分钟获取一次平均通话次数

时间:2018-10-19 10:26:55

标签: sql sql-server qsqlquery

我正在运行以下查询

select DateTime
from Calls
where DateTime > '17 Oct 2018 00:00:00.000' and
      DialedNumberID = '1234'

这将为我提供在特定日期拨打此号码的所有时间的列表。

pic here:

基本上,我要查找的是一个查询,该查询可以让我每隔X分钟拨打一次平均电话,并且希望全年运行一次查询。

谢谢

2 个答案:

答案 0 :(得分:0)

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

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

  SELECT YEAR(`DateTime`),
         DialedNumberID,
         COUNT(*) call_count
    FROM Calls
   GROUP BY YEAR(`DateTime`), DialedNumberID

此模式的诀窍是GROUP BY f(date)。函数f()将任何日期缩短为发生的年份。

以五分钟为间隔的摘要,您需要f(date)将日期戳减少到五分钟为间隔。该功能比YEAR()要复杂得多。

DATE_FORMAT(datestamp,'%Y-%m-%d %H:00') + INTERVAL (MINUTE(datestamp) - MINUTE(datestamp) MOD 5)

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_FORMAT()表达式定义一个存储函数,可以使查询更清楚,更不重复。但这是另一天的话题。

最后,添加

  WHERE YEAR(`DateTime`) = YEAR(NOW())
    AND DialedNumberID = '1234' 

查询以按当前年份和特定ID进行过滤。

此查询将需要进行工作以使其尽可能高效。这也是另一天的话题。

专业提示: DATETIME是MySQL中的保留字。列名通常不区分大小写。避免为您的列命名,在这种情况下为DateTime,与保留字相同。

答案 1 :(得分:0)

每个时间间隔的平均通话量是通话次数(COUNT(*))除以受监控时段(TIMESTAMPDIFF(minute, period_start, period_end))的开始到结束之间的分钟数再乘以分钟数所需的时间间隔(在您的示例中为5)。

对于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;