有表通话记录表一张,数据N条
字段:开始通话时间,         结束时间,               ,记录通话状态
数据:2011-08-03 12:23:32    2011-08-03 12:25:45         1/0  (1代表成功,0:false)
      ……
要求:更具时间分段统计出各个时间段通话的条数要求显示:时间段          成功通话条数     未接通条数
          09:30-10:30         1              6
          10:30-11:30         23             54
           ……
          18:30-19:30         32            34
求各位高手、前辈解决
注:oracle
最好是select语句

解决方案 »

  1.   

    你的问题的难点应该是:如何解决跨时间段的通话如果忽略这个业务问题的话,简单的 很,直接
    select count(*) from tb where 通话开始时间 BETWEEN 时间段 
    union
    select count(*) from tb where 通话开始时间 BETWEEN 时间段 
    这个是最简单的实现,如果要考虑效率问题,当然还有其它的实现语句,使用高级函数,
      

  2.   

    WITH TAB AS
     (SELECT TO_DATE('2011-08-03 12:23:32', 'yyyy-mm-dd hh24:mi:ss') STARTDATE,
             TO_DATE('2011-08-03 12:25:45 ', 'yyyy-mm-dd hh24:mi:ss') AS ENDDATE,
             1 AS FLAG
        FROM DUAL
      
      UNION
      SELECT TO_DATE('2011-08-03 12:29:32', 'yyyy-mm-dd hh24:mi:ss') STARTDATE,  -- 在11:30-12:30有一条通话记录,在12:30-13:30也有通话记录
             TO_DATE('2011-08-03 12:33:45 ', 'yyyy-mm-dd hh24:mi:ss'),
             1 AS FLAG
        FROM DUAL
      UNION
      SELECT TO_DATE('2011-08-03 12:50:32', 'yyyy-mm-dd hh24:mi:ss') STARTDATE,
             TO_DATE('2011-08-03 12:50:45 ', 'yyyy-mm-dd hh24:mi:ss'),
             0 AS FLAG
        FROM DUAL
      UNION
      SELECT TO_DATE('2011-08-03 09:50:32', 'yyyy-mm-dd hh24:mi:ss') STARTDATE,
             TO_DATE('2011-08-03 10:50:45 ', 'yyyy-mm-dd hh24:mi:ss'),
             0 AS FLAG
        FROM DUAL)
    SELECT TO_CHAR(TDATE.BENGDATE, 'hh24:mi') || '-' || TO_CHAR(TDATE.ENDDATE, 'hh24:mi') TIME,
           SUM(FLAG) AS 成功通话条数,
           SUM(DECODE(FLAG, 0, 1, 0)) AS 未接通条数
      FROM TAB,
           (SELECT (TO_DATE('2011-08-03 09:30:00', 'yyyy-mm-dd hh24:mi:ss') +  -- '2011-08-03 09:30:00'是要查询的开始时间
                   (ROWNUM - 1) / 24) BENGDATE,
                   (TO_DATE('2011-08-03 09:30:00', 'yyyy-mm-dd hh24:mi:ss') +
                   (ROWNUM) / 24) ENDDATE
              FROM DUAL
            CONNECT BY ROWNUM < 17  -- 需要查询的时间的小时数
            ) TDATE
     WHERE TAB.STARTDATE BETWEEN TDATE.BENGDATE AND TDATE.ENDDATE
        OR TAB.ENDDATE BETWEEN TDATE.BENGDATE AND TDATE.ENDDATE
     GROUP BY TO_CHAR(TDATE.BENGDATE, 'hh24:mi') || '-' ||
              TO_CHAR(TDATE.ENDDATE, 'hh24:mi')
     ORDER BY TIME