CREATE OR REPLACE FUNCTION check_com_meter() RETURNS TRIGGER AS ' DECLARE times TIMESTAMP WITHOUT TIME ZONE; temp_time TIMESTAMP; time_interval INTEGER; rows INTEGER; temp INTEGER; month1 INTEGER; month2 INTEGER; year1 INTEGER; year2 INTEGER; reading double precision; average double precision; makeup_reading double precision; BEGIN temp_time := now(); temp_time := date_trunc(''second'', temp_time); month1 := EXTRACT(MONTH FROM temp_time); month2 := EXTRACT(MONTH FROM NEW.timestamp); year1 := EXTRACT(YEAR FROM temp_time); year2 := EXTRACT(YEAR FROM NEW.timestamp); IF month1 != month2 THEN temp := EXTRACT(EPOCH FROM temp_time); ELSE IF year1 != year2 THEN temp := EXTRACT(EPOCH FROM temp_time); ELSE temp := EXTRACT(EPOCH FROM NEW.timestamp); END IF; END IF; --temp := EXTRACT(EPOCH FROM NEW.timestamp); IF temp % 900 != 0 THEN temp := temp / 900; temp := temp * 900; NEW.timestamp := ''epoch''::timestamptz + temp * interval ''1 second''; END IF; SELECT INTO times, reading timestamp, readings FROM com_meter WHERE amrid = NEW.amrid AND channel = NEW.channel ORDER BY timestamp DESC; IF NOT FOUND THEN RETURN NEW; ELSE temp := EXTRACT(EPOCH FROM times); IF temp % 900 != 0 THEN temp := temp / 900; temp := temp * 900; times := ''epoch''::timestamptz + temp * interval ''1 second''; END IF; time_interval := EXTRACT(EPOCH FROM NEW.timestamp) - EXTRACT(EPOCH FROM times); rows := time_interval / 900; IF time_interval <= 0 THEN return NULL; ELSE IF rows > 1 THEN average := (NEW.readings - reading)/rows; FOR i IN 1 .. rows-1 LOOP makeup_reading := reading + average*i; times := times + interval ''900 second''; INSERT INTO com_meter(amrid,timestamp,demand_int,curr_demand, max_demand,max_demand_time,units,readings,channel,tri_add) VALUES(NEW.amrid, times, NEW.demand_int, NEW.curr_demand,NEW.max_demand, NEW.max_demand_time, NEW.units,makeup_reading,NEW.channel,1); END LOOP; END IF; END IF; RETURN NEW; END IF; END; ' LANGUAGE 'plpgsql'; CREATE TRIGGER check_com_meter BEFORE INSERT ON com_meter FOR EACH ROW EXECUTE PROCEDURE check_com_meter();