-- -- next_day/2 -- create or replace function next_day( timestamp with time zone, character varying ) returns timestamptz as $$ declare next_day__somedate alias for $1; next_day__weekday alias for $2; v_dow integer; v_ref_dow integer; v_add_days integer; begin -- I cant find a function that converts days of the week to -- the corresponding integer value, so I roll my own (above) -- We avoid extract(dow from timestamp) because of incompatible output with to_char. v_ref_dow := dow_to_int(next_day__weekday); v_dow := to_number(to_char(next_day__somedate,'D'),'9'); -- If next_day___weekday is the same day of the week as -- next_day__somedate, we add a full week. if v_dow < v_ref_dow then v_add_days := v_ref_dow - v_dow; else v_add_days := v_ref_dow - v_dow + 7; end if; -- Do date math return next_day__somedate + to_interval(v_add_days,'days'); end;$$ language plpgsql;