+ -
当前位置:首页 → 问答吧 → 关于Oracle的时间分段查询

关于Oracle的时间分段查询

时间:2011-12-03

来源:互联网

目前手上在做一个水表的监控系统,数据库是Oracle,有一个功能是按照时间段做报表。
现在有一个流量表FlowData,字段有id(编号),msgTime(时间),nFlow(流量值),想在某一天内统计各个时段(1小时、2小时、4小时等等,都能被24整除,以2小时为例)的流量,查询效果如下:
时段 流量
0:00-2:00 XX
2:00-4:00 XX
4:00-6:00 XX
.
.
22:00-0:00(也可以是24:00) XX
如果说有的时段没有值,也得查询出来(0也可以不显示)如:
2:00-4:00 0
谢谢大家~~

作者: m8857695   发布时间: 2011-12-03

原始数据存储的是什么,给些示例数据。

作者: LuiseRADL   发布时间: 2011-12-03

造了点数据
SQL code

create table FLOWDATA
(
  id      NUMBER not null,
  msgtime DATE,
  nflow   NUMBER
)

insert into FLOWDATA (ID, MSGTIME, NFLOW)
values (1, to_date('01-12-2012 01:12:01', 'dd-mm-yyyy hh24:mi:ss'), 1);

insert into FLOWDATA (ID, MSGTIME, NFLOW)
values (2, to_date('01-12-2012 01:15:01', 'dd-mm-yyyy hh24:mi:ss'), 2);

insert into FLOWDATA (ID, MSGTIME, NFLOW)
values (3, to_date('01-12-2011 03:15:01', 'dd-mm-yyyy hh24:mi:ss'), 1);

insert into FLOWDATA (ID, MSGTIME, NFLOW)
values (4, to_date('01-12-2011 06:01:01', 'dd-mm-yyyy hh24:mi:ss'), 2);

insert into FLOWDATA (ID, MSGTIME, NFLOW)
values (5, to_date('01-12-2011 08:06:01', 'dd-mm-yyyy hh24:mi:ss'), 1);

insert into FLOWDATA (ID, MSGTIME, NFLOW)
values (6, to_date('01-12-2011 09:30:01', 'dd-mm-yyyy hh24:mi:ss'), 2);

insert into FLOWDATA (ID, MSGTIME, NFLOW)
values (7, to_date('01-12-2011 10:20:01', 'dd-mm-yyyy hh24:mi:ss'), 2);

insert into FLOWDATA (ID, MSGTIME, NFLOW)
values (8, to_date('01-12-2011 11:02:01', 'dd-mm-yyyy hh24:mi:ss'), 1);


作者: m8857695   发布时间: 2011-12-03

这个统计有意义吗,因为你原始的记录都是某一时间点的流量值,而时间点又不连续,加和有意义吗?

作者: LuiseRADL   发布时间: 2011-12-03

这个数据只不过是为了说明问题临时编的,实际数据是连续取样的,非常庞大,无法给您演示

作者: m8857695   发布时间: 2011-12-03

语句:
SQL code

SELECT '00:00-02:00' AS h, SUM(nFlow) AS s
FROM flowdata
WHERE msgtime BETWEEN to_date('2011-12-01 00:00:00', 'YYYY-MM-DD HH24:MI:SS')
AND to_date('2011-12-01 02:00:00', 'YYYY-MM-DD HH24:MI:SS')

UNION ALL

SELECT '02:00-04:00' AS h, SUM(nFlow) AS s
FROM flowdata
WHERE msgtime BETWEEN to_date('2011-12-01 02:00:00', 'YYYY-MM-DD HH24:MI:SS')
AND to_date('2011-12-01 04:00:00', 'YYYY-MM-DD HH24:MI:SS')

UNION  ALL 
SELECT '04:00-06:00' AS h, SUM(nFlow) AS s
FROM flowdata
WHERE msgtime BETWEEN to_date('2011-12-01 04:00:00', 'YYYY-MM-DD HH24:MI:SS')
AND to_date('2011-12-01 06:00:00', 'YYYY-MM-DD HH24:MI:SS')

UNION ALL
SELECT '06:00-08:00' AS h, SUM(nFlow) AS s
FROM flowdata
WHERE msgtime BETWEEN to_date('2011-12-01 06:00:00', 'YYYY-MM-DD HH24:MI:SS')
AND to_date('2011-12-01 08:00:00', 'YYYY-MM-DD HH24:MI:SS')

UNION ALL
SELECT '08:00-10:00' AS h, SUM(nFlow) AS s
FROM flowdata
WHERE msgtime BETWEEN to_date('2011-12-01 08:00:00', 'YYYY-MM-DD HH24:MI:SS')
AND to_date('2011-12-01 10:00:00', 'YYYY-MM-DD HH24:MI:SS')

UNION  ALL
SELECT '10:00-12:00' AS h, SUM(nFlow) AS s
FROM flowdata
WHERE msgtime BETWEEN to_date('2011-12-01 10:00:00', 'YYYY-MM-DD HH24:MI:SS')
AND to_date('2011-12-01 12:00:00', 'YYYY-MM-DD HH24:MI:SS')



结果:


因为测试数据只到12点的,如果再增加其它时间段,就再增加几个union all子句。

作者: LuiseRADL   发布时间: 2011-12-03

引用 5 楼 luiseradl 的回复:

语句:
SQL code

SELECT '00:00-02:00' AS h, SUM(nFlow) AS s
FROM flowdata
WHERE msgtime BETWEEN to_date('2011-12-01 00:00:00', 'YYYY-MM-DD HH24:MI:SS')
AND to_date('2011-12-01 02:00:00', 'YYYY-MM-DD H……

有没有更加通用一点的方法,union all这个方法自然是可以,但是就把通用性的工作扔到了开发语言上,总感觉没有把Oracle的优势发挥出来

作者: m8857695   发布时间: 2011-12-03