关于Oracle的时间分段查询
时间:2011-12-03
来源:互联网
现在有一个流量表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
语句:
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
热门阅读
-
office 2019专业增强版最新2021版激活秘钥/序列号/激活码推荐 附激活工具
阅读:74
-
如何安装mysql8.0
阅读:31
-
Word快速设置标题样式步骤详解
阅读:28
-
20+道必知必会的Vue面试题(附答案解析)
阅读:37
-
HTML如何制作表单
阅读:22
-
百词斩可以改天数吗?当然可以,4个步骤轻松修改天数!
阅读:31
-
ET文件格式和XLS格式文件之间如何转化?
阅读:24
-
react和vue的区别及优缺点是什么
阅读:121
-
支付宝人脸识别如何关闭?
阅读:21
-
腾讯微云怎么修改照片或视频备份路径?
阅读:28