问题如下:
有一张表,在表中有一个字段,Online字段,0表示不在线,1表示在线,设备在运行过程中进行统计它的在线时间,这个在线可能是不连续的,例如:在线时间1:2011-01-09到02-12在线,在线时间2:2011-03-21到05-03在线,可能中间有间隔,如何统计总得在线时间?
有一张表,在表中有一个字段,Online字段,0表示不在线,1表示在线,设备在运行过程中进行统计它的在线时间,这个在线可能是不连续的,例如:在线时间1:2011-01-09到02-12在线,在线时间2:2011-03-21到05-03在线,可能中间有间隔,如何统计总得在线时间?
解决方案 »
- 哪位大虾解释一下为什么数据表之间的环路需要处理?
- 求救,SQL LOADER如何导入无分隔无固定长度的多行数据
- oracle中触发器实现某个表的历史修改痕迹记录的问题
- 一个看上简单,实际很复杂的问题--树型数据结构的库表设计问题?
- 在PLSQL Developer中用关联查询,找不到想要的资料,请高人帮忙看看
- SQL问题 急!!!
- 一个简单的问题,如何在Oracle中建一个编号会自动增加的字段,以利于查询?- (40分请教)
- 问几个简单的SQL语句在ORACLE中怎么写,如去空格、截取、日期字段比较,?
- 大量数据操作时INSERT INTO TABLE2 SELECT * from TABLE1 ……是否适用?
- 如何用SQL检索出一个DataBase里面所有的用户
- oracle客户端连接服务器正常,查询超时
- fedora系统,用root或oracle能成功登录oralce,普通用户就不行
PkID INTEGER not null,
DeviceID INTEGER default 0 not null,
ParameterID VARCHAR2(255) not null,
AlarmLevel INTEGER default NULL,
AlarmStatus INTEGER default NULL,
AlarmTime TIMESTAMP default SYSDATE not null,
AlarmReason VARCHAR2(255) default NULL,
AlarmValue FLOAT default 0 not null,
AlarmConditions VARCHAR2(255) default NULL,
LowerThreshold FLOAT,
UpperThreshold FLOAT,
Online integer,
ALARMRELIEVETIME date,
ALARMRELIEVEMODE integer,
constraint PK_DEVICEALARMINFO primary key ("PkID")
)数据表如上所示
create table DeviceAlarmInfo (
PkID INTEGER not null,
DeviceID INTEGER default 0 not null, --设备编号
ParameterID VARCHAR2(255) not null, --设备参数编号
AlarmLevel INTEGER default NULL, --告警等级
AlarmStatus INTEGER default NULL, --告警状态
AlarmTime TIMESTAMP default SYSDATE not null, --告警时间
AlarmReason VARCHAR2(255) default NULL,
AlarmValue FLOAT default 0 not null, --告警值
AlarmConditions VARCHAR2(255) default NULL,
LowerThreshold FLOAT, --最小阀值
UpperThreshold FLOAT, --最大阀值
Online integer, --在线状态
ALARMRELIEVETIME date, --解除时间
ALARMRELIEVEMODE integer, --解除方式
constraint PK_DEVICEALARMINFO primary key ("PkID")
)Online为在线状态
select t.PkID,sum(t.time)
(select PkID ,
DeviceID,
ParameterID ,
AlarmLevel,
AlarmStatus,
AlarmTime,
AlarmReason,
AlarmValue
AlarmConditions,
LowerThreshold,
UpperThreshold,
Online integer,
ALARMRELIEVETIME,
ALARMRELIEVEMODE,
ALARMRELIEVETIME-AlarmTime
from DeviceAlarmInfo) t
group by PkID;
--上面有点错,先把每条记录的在线时间time计算出来,然后同种机器group一下,sum(time)就是总的在线时间
select t.PkID,sum(t.time)
(select PkID ,
DeviceID,
ParameterID ,
AlarmLevel,
AlarmStatus,
AlarmTime,
AlarmReason,
AlarmValue
AlarmConditions,
LowerThreshold,
UpperThreshold,
Online,
ALARMRELIEVETIME,
ALARMRELIEVEMODE,
nvl(ALARMRELIEVETIME,sysdate)-AlarmTime time
from DeviceAlarmInfo) t
group by PkID;