问题如下:
有一张表,在表中有一个字段,Online字段,0表示不在线,1表示在线,设备在运行过程中进行统计它的在线时间,这个在线可能是不连续的,例如:在线时间1:2011-01-09到02-12在线,在线时间2:2011-03-21到05-03在线,可能中间有间隔,如何统计总得在线时间?

解决方案 »

  1.   

    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")
    )数据表如上所示
      

  2.   

    不好意思,我的失误
    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为在线状态
      

  3.   


    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;
      

  4.   


    --上面有点错,先把每条记录的在线时间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;