有表通话记录表一张,数据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语句
字段:开始通话时间, 结束时间, ,记录通话状态
数据: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语句
select count(*) from tb where 通话开始时间 BETWEEN 时间段
union
select count(*) from tb where 通话开始时间 BETWEEN 时间段
这个是最简单的实现,如果要考虑效率问题,当然还有其它的实现语句,使用高级函数,
(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