【问题标题】:SQL : counting calls in 10 min incrementsSQL:以 10 分钟为增量计数调用
【发布时间】:2012-09-11 14:17:36
【问题描述】:

我需要确定当月以 10 分钟为增量,我们接听了多少电话。我有以下 SQL 查询可以在半小时内工作,但我无法让它以 10 分钟为增量工作。我可能缺少一些简单的东西。任何帮助将不胜感激。谢谢

select 
    count(*) as Callcount,
    case 
       when datepart(mi, PBXqtime) < 30 
          then dateadd(hh, datediff(hh, 0, PBXqtime) + 0, 0)
          else dateadd(mi, 30, dateadd(hh, datediff(hh, 0, PBXqtime) + 0, 0)) 
    end as time
from 
    callcomplete 
where 
    CustId = '3100472' 
    and PBXQTime between '11/1/11 0:0:00' and '11/30/11 23:59:00'
group by 
    case 
       when datepart(mi, PBXqtime) < 30 
        then dateadd(hh, datediff(hh, 0, PBXqtime) + 0, 0) 
        else dateadd(mi, 30, dateadd(hh, datediff(hh, 0, PBXqtime) + 0, 0)) 
    end

【问题讨论】:

  • 你不把数字 30 换成 10 吗?为什么这不起作用?
  • @RBarryYoung:因为在每个 CASE 语句中都需要 5 个 WHEN 子句和一个 ELSE 子句。
  • @Jonathan Leffler:啊,对。
  • SQL 是一种语言,不同的数据库产品以不同的方式实现。最大的变化领域之一是日期时间操作函数。我可以猜测这是 SQL Server(或可能是 Sybase),但请编辑您的问题并添加合适的标签。

标签: sql datediff dateadd


【解决方案1】:

尚未测试,但是:

SELECT
    DATEPART(DAY, pbxqtime) AS [day], DATEPART(HOUR, pbxqtime) AS [hour], 
    (DATEPART(MINUTE, pbxqtime) / 10) AS [interval], COUNT(*) AS Callcount
FROM
    callcomplete
WHERE
    custid = '3100472'
    AND pbxqtime BETWEEN '11/1/11 0:0:00' AND '11/30/11 23:59:00'
GROUP BY
    DATEPART(DAY, pbxqtime), DATEPART(HOUR, pbxqtime), 
    (DATEPART(MINUTE, pbxqtime) / 10)

这是假设一个 MSSQL 环境。此外,关于如何指定日期范围,下面还有一场激烈的争论。有人认为,使用简单的运算符,如&gt;=&lt;= 效果更好,更干净。因此,您也可以使用AND pbxqtime &gt;= '2011-11-01' AND pbxqtime &lt; '2011-12-01'

【讨论】:

  • 这是一个蹩脚的代码行:AND pbxqtime BETWEEN '11/1/11 0:0:00' AND '11/30/11 23:59:00',看到这样编码的东西让我抓狂!你会在一天的最后一分钟错过任何数据!不要给我一些关于这从未发生过的 BS,因为数据丢失,我已经在旧应用程序中多次调试过同一行代码。编写此代码的最佳方法是使用少于下个月的第一天,例如:AND pbxqtime&gt;='2011-11-1' AND pbxqtime&lt;'2011-12-1' 这样做,每次都这样,你永远不会有问题。
  • @KM 感谢您的评论。 BETWEEN '2011-11-01' AND '2011-11-30' 不也可以吗?
  • 不会。 只是忘记使用between,我从不编码between > >= BETWEEN '2011-11-01' AND '2011-11-30' 转换为 BETWEEN '2011-11-01 00:00:00' AND '2011-11-30 00:00:00',因此您几乎会错过最后一天的数据。
  • @KM - 我不知道任何理智的人会使用这种格式。 And yet...
  • 我从未见过最终用户输入20120910,但他们总是在我工作的地方输入2012-09-10
【解决方案2】:

我认为这会起作用(但未经测试,因为我没有你的数据):

select 
    count(*) as Callcount,
    DATEADD(minute,(DATEDIFF(minute,'20100101',PBXQTime) / 10)*10,'20100101')
from 
    callcomplete 
where 
    CustId = '3100472' 
    and PBXQTime >= '20111101'
    and PBXQTime < '20111201'
group by 
    DATEADD(minute,(DATEDIFF(minute,'20100101',PBXQTime) / 10)*10,'20100101')

只需将距某个固定时间点的分钟数除以 10(将​​向下舍入为最接近的整数),然后乘以 10 并加回到同一固定时间点。

【讨论】:

    猜你喜欢
    • 2022-01-22
    • 1970-01-01
    • 2010-11-16
    • 2023-01-04
    • 2016-04-15
    • 2016-10-29
    • 1970-01-01
    • 2022-11-18
    • 1970-01-01
    相关资源
    最近更新 更多