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

sg3maiej  于 2023-02-15  发布在  其他
关注(0)|答案(3)|浏览(139)

我正在运行以下查询

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

这会给予我一个列表,列出这个号码在特定日期拨打的所有次数。

本质上,我正在寻找的是一个查询,它将给予我每X分钟发生的平均呼叫,并希望运行全年的查询。
谢谢

kpbpu008

kpbpu0081#

我猜您有一个名为Calls的表,其中包含DateTimeDialedNumberID列。
您可以使用模式的种类逐年汇总该表中的信息。

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

这个模式的诀窍是GROUP BY f(date),函数f()将任何日期缩减到它发生的年份。
以5分钟为间隔进行汇总,需要f(date)将日期戳减少到5分钟间隔,这个函数比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

8ulbf1ek

8ulbf1ek2#

每个时间间隔的平均呼叫数等于呼叫数(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;
ee7vknir

ee7vknir3#

这将强制调用时间为5分钟间隔。请对这些间隔使用“count”和“group by”。使用DateTime作为列名会引起混淆
SELECT DATEADD(分钟,强制转换(日期部分(分钟,[日期时间]作为整数)%5 * - 1,强制转换(格式为([日期时间],“MM/DD/YYYY hh:mm”)作为日期时间))作为调用间隔,按日期分组的调用计数(*)ADD(分钟,强制转换(日期部分(分钟,[日期时间])作为整数)%5 * - 1,强制转换(格式为([日期时间],“MM/DD/YYYY hh:mm”)作为日期时间))

相关问题