On Jun 1, 2007, at 13:00 , Mike Ginsburg wrote:

age() is exactly what I needed. Now I just feel dumb for not looking into it. As far as getting the highest unit (day, month, year, etc) I am currently using CASES

SELECT CASE
WHEN (now() - change_time) < '1 min'::interval THEN date_part('seconds', age(now(), change_time)) WHEN (now() - change_time) < '1 hour'::interval THEN date_part('minutes', age(now(), change_time))
               END
FROM...

Any better way to do it?

Personally I'd push the age() into a subquery so it's only called once (though I think PostgreSQL knows it only needs to evaluate it once) or maybe wrap the whole case statement in a function (untested):

CREATE FUNCTION approximate_age
(
        p_since TIMESTAMP WITH TIME ZONE
) RETURNS DOUBLE PRECISION
IMMUTABLE
LANGUAGE PLPGSQL
AS $_$
DECLARE
    v_age INTERVAL;
    v_approximate_age DOUBLE PRECISION;
    v_precision TEXT;
BEGIN
    v_age := age(p_since);
    IF v_age < INTERVAL '1 min' THEN
        v_precision := 'seconds';
    ELSIF v_age < INTERVAL '1 hour' THEN
        v_precision := 'minutes';
    -- ...
    END IF;

    IF v_precision IS NULL
    -- catch case when no precision has been set
        v_approximate_age = v_age;
    ELSE
        v_approximate_age := date_part(v_precision, v_age);
    END IF;

RETURN v_approximate_age;
$_$;

Then just SELECT approximate_age(change_time);

Michael Glaesemann
grzm seespotcode net



---------------------------(end of broadcast)---------------------------
TIP 3: Have you checked our extensive FAQ?

              http://www.postgresql.org/docs/faq

Reply via email to