Wir loggen hier in den Funktionstesten immer einen Timestamp und wollen in Zukunft auch unsere Anlagenüberwachen. Nun ist es in diesem Zusamenhang interessant, Zykluszeiten also z.B. den Abstand zwischen der Fertigstellung zweier Produkte zu ermitteln und das zum Gegenstand statistischer Untersuchungen zu machen.

Um das mit der DB PostgreSQL einfach zu leisten, habe ich hier die dazugehörige DB-Funktion:
Code:
CREATE OR REPLACE FUNCTION getcyclustimes(pproductid character varying, pfrom timestamp without time zone, pto timestamp without time zone)
  RETURNS SETOF interval AS
$BODY$DECLARE
    x TIMESTAMP;
    r RECORD; 
BEGIN
    x := '3000-01-01 00:00:00'::timestamp;
    FOR r IN SELECT "timestamp" FROM results WHERE (productid=pproductid) AND ("timestamp" BETWEEN pfrom AND pto) LOOP
        IF x='3000-01-01 00:00:00'::timestamp THEN
            x := r."timestamp";
            CONTINUE;
        ELSE
            RETURN NEXT (r."timestamp"-x);
            x := r."timestamp";
        END IF;
    END LOOP;
END;$BODY$
  LANGUAGE 'plpgsql' STABLE;
ALTER FUNCTION getcyclustimes(pproductid character varying, pfrom timestamp without time zone, pto timestamp without time zone) OWNER TO postgres;
GRANT EXECUTE ON FUNCTION getcyclustimes(pproductid character varying, pfrom timestamp without time zone, pto timestamp without time zone) TO public;
GRANT EXECUTE ON FUNCTION getcyclustimes(pproductid character varying, pfrom timestamp without time zone, pto timestamp without time zone) TO postgres;
Dann braucht man die Funktion nur noch so aufzurufen:

Code:
SELECT getcyclustimes as "time" FROM getcyclustimes('Productname'::char varying,'2008-01-03 09:00'::timestamp,'2008-01-03 11:00'::timestamp)
Der Output gibt dann die zeitlichen Differenzen zwischen zeitlich aufeinanderfolgenden Datensätzen aus. Bsp:

Code:
"00:01:10"
"00:01:11"
"00:01:10"
"00:00:15"
"00:01:10"
"00:01:11"
"00:01:10"
"00:01:10"
"00:01:10"
"00:01:10"
"00:04:26"
"00:01:10"
"00:01:11"
"00:01:10"
"00:01:10"
"00:01:23"
"00:01:31"
"00:01:11"
"00:01:10"