数据库时间字段是以分钟存储的:2008-08-01 00:00:00.000,2008-08-01 00:01:00.000存储了24小时的数据,我现在想统计每小时的bmtx,bmty,bmtz,bmtf的平均值,最好是写成存储过程。
例如查询出来的结构:
2008-08-01 01:00:00.000 ,平均数据
2008-08-01 02:00:00.000 ,平均数据
2008-08-01 03:00:00.000 ,平均数据
以下是数据库表结构和测试插入的存储过程:drop table station_data;
drop table station;
drop sequence seq_station_data_id;
drop trigger trg_station_data_id;create table station
(
station_id int not null primary key,
station_name varchar2(50)
)
/drop sequence seq_station_id;
create sequence seq_station_id;drop trigger trg_station_id;
create trigger trg_station_id
before insert on station for each row
begin
   select seq_station_id.nextval into :new.station_id from dual;
end;
/create table station_data
(
station_data_id int not null primary key,
station_id int not null,
data_date timestamp(3) not null,
doy int not null,
bmtx number(9,2) not null,
bmty number(9,2) not null,
bmtz number(9,2) not null,
bmtf number(9,2) not null
)
/
create sequence seq_station_data_id;create trigger trg_station_data_id
before insert on station_data for each row
begin
   select seq_station_data_id.nextval into :new.station_data_id from dual;
end;
/
alter table station_data add constraint fk_station_id 
foreign key(station_id) references station(station_id);create or replace procedure proInsertStationData(sname varchar2,
data_date varchar2,doy int,bmtx number,bmty number,bmtz number,bmtf number)
as station_id int;
begin
select station_id into station_id from station where station_name = sname ;
insert into station_data values 
(0,station_id,to_timestamp(data_date,'yyyy-mm-dd hh24:mi:ss.ff'),doy,bmtx,bmty,bmtz,bmtf); 
exception
when no_data_found then dbms_output.put_line('没有找到数据');  
commit; 
end;
/insert into station values (0,'ssl');commit; execute proInsertStationData('ssl','2009-08-25 00:00:00.000',214,28292.0,-3696.7,46929.5,99999.0);

解决方案 »

  1.   

    按小时统计,自己包装成过程。
    select trunc(to_date(data_date,'yyyy-mm-dd hh24:mi:ss'),'hh') h,avg(bmtx),avg(bmty),avg(bmtz),avg(bmtf) 
           from station_data
           group by trunc(to_date(data_date,'yyyy-mm-dd hh24:mi:ss'),'hh')
           order by trunc(to_date(data_date,'yyyy-mm-dd hh24:mi:ss'),'hh')
      

  2.   


    select trunc(data_date,'HH24'),avg(bmtx),avg(bmty),avg(bmtz),avg(bmtf) from station_data
    group by trunc(data_date,'HH24');
      

  3.   

    调试过后的:
    select to_char(trunc(s.data_date,'hh24'),'yyyy-mm-dd hh24:mi:ss') data_date ,
    trunc(avg(s.doy),2) doy ,trunc(avg(s.bmtx),2) bmtx ,trunc(avg(s.bmty),2) bmty ,
    trunc(avg(s.bmtz),2) bmtz ,trunc(avg(s.bmtf),2) bmtf from station_data s
    group by to_char(trunc(s.data_date,'hh24'),'yyyy-mm-dd hh24:mi:ss')
    order by to_char(trunc(s.data_date,'hh24'),'yyyy-mm-dd hh24:mi:ss');
      

  4.   

    select to_char(trunc(s.data_date,'hh24'),'yyyy-mm-dd hh24:mi:ss') data_date , 
    trunc(avg(s.doy),2) doy ,trunc(avg(s.bmtx),2) bmtx ,trunc(avg(s.bmty),2) bmty , 
    trunc(avg(s.bmtz),2) bmtz ,trunc(avg(s.bmtf),2) bmtf from station_data s 
    group by to_char(trunc(s.data_date,'hh24'),'yyyy-mm-dd hh24:mi:ss') 
    order by to_char(trunc(s.data_date,'hh24'),'yyyy-mm-dd hh24:mi:ss');