Лыцарь пичальнава образа - Дарю функцию [entries|archive|friends|userinfo]
silly_sad

[ userinfo | ljr userinfo ]
[ archive | journal archive ]

Дарю функцию [Feb. 10th, 2010|11:05 am]
Previous Entry Add to Memories Tell A Friend Next Entry
-- args:
-- $1 -- an interval to divide
-- $2 -- a divisor interval
-- $3 -- accuracy (an interval about zero to treat as zero value)
-- returns:
-- a float number indicating ratio of $1 by $2 (how many times $1 is longer than $2)
CREATE OR REPLACE FUNCTION interval_ratio ( INTERVAL, INTERVAL, INTERVAL ) RETURNS FLOAT8 AS $$
DECLARE
sign INT2;
k INT8;
c INTERVAL;
t INTERVAL;
a INTERVAL;
b INTERVAL;
epsilon INTERVAL;
BEGIN
a = $1;
b = $2;
epsilon = $3;

IF epsilon <= '0 sec'::INTERVAL THEN
epsilon := '0.00001 sec';
END IF;

sign := 1;
IF a < '0 sec'::INTERVAL THEN
sign := -sign;
a := a*(-1);
END IF;
IF b < '0 sec'::INTERVAL THEN
sign := -sign;
b := b*(-1);
END IF;

IF a < b THEN
RETURN sign/interval_ratio (b,a,epsilon);
END IF;
IF a - b <= epsilon THEN
RETURN sign;
END IF;

k := 1;
t := b;
WHILE (a > t) LOOP
c := t;
t := t*2;
k := k*2;
END LOOP;
k := k/2;
a := a-c;

RETURN sign*(k + interval_ratio(a,b,epsilon));
END;
$$ LANGUAGE plpgsql IMMUTABLE RETURNS NULL ON NULL INPUT;



а почему в постгресе не работает как надо оператор деления?
LinkLeave a comment