Есть ли функция postgresql, которая возвращает метку времени, округленную до ближайшей минуты? Входное значение - это метка времени, а возвращаемое значение должно быть меткой времени.
postgresql
дан
источник
источник
Ответьте на аналогичный (и более общий) вопрос,
CREATE FUNCTION round_minutes(TIMESTAMP WITHOUT TIME ZONE, integer) RETURNS TIMESTAMP WITHOUT TIME ZONE AS $$ SELECT date_trunc('hour', $1) + cast(($2::varchar||' min') as interval) * round( (date_part('minute',$1)::float + date_part('second',$1)/ 60.)::float / $2::float ) $$ LANGUAGE SQL IMMUTABLE; CREATE FUNCTION round_minutes(TIMESTAMP WITHOUT TIME ZONE, integer,text) RETURNS text AS $$ SELECT to_char(round_minutes($1,$2),$3) $$ LANGUAGE SQL IMMUTABLE; SELECT round_minutes('2010-09-17 16:23:12', 5); -- 2010-09-17 16:25:00 SELECT round_minutes('2010-09-17 16:23:12', 10, 'HH24:MI'); -- 16:20
Адаптировано из http://wiki.postgresql.org/wiki/Round_time и для «точного раунда», как показал @CrowMagnumb.
источник
Пытаясь использовать приведенный выше ответ Питера для создания функций потолка и пола, я обнаружил, что вы также должны учитывать секунды при вызове функции округления. Вот мои наборы функций, которые будут делать круглые, полные и потолочные метки времени.
CREATE OR REPLACE FUNCTION round_minutes( TIMESTAMP WITHOUT TIME ZONE, integer) RETURNS TIMESTAMP WITHOUT TIME ZONE AS $$ SELECT date_trunc('hour', $1) + (cast(($2::varchar||' min') as interval) * round( (date_part('minute',$1)::float + date_part('second',$1)/ 60.)::float / cast($2 as float))) $$ LANGUAGE SQL IMMUTABLE STRICT; CREATE OR REPLACE FUNCTION floor_minutes( TIMESTAMP WITHOUT TIME ZONE, integer ) RETURNS TIMESTAMP WITHOUT TIME ZONE AS $$ SELECT round_minutes( $1 - cast((($2/2)::varchar ||' min') as interval ), $2 ); $$ LANGUAGE SQL IMMUTABLE STRICT; CREATE OR REPLACE FUNCTION ceiling_minutes( TIMESTAMP WITHOUT TIME ZONE, integer ) RETURNS TIMESTAMP WITHOUT TIME ZONE AS $$ SELECT round_minutes( $1 + cast((($2/2)::varchar ||' min') as interval ), $2 ); $$ LANGUAGE SQL IMMUTABLE STRICT;
источник
int DEFAULT 5
(второй параметр), чтобы упростить наиболее частое использование.LANGUAGE SQL IMMUTABLE
.округлить отметку времени в меньшую сторону
CREATE or replace FUNCTION date_round_down(base_date timestamptz, round_interval INTERVAL) RETURNS timestamptz AS $BODY$ SELECT TO_TIMESTAMP(EXTRACT(epoch FROM date_trunc('hour', $1))::INTEGER + trunc((EXTRACT(epoch FROM $1)::INTEGER - EXTRACT(epoch FROM date_trunc('hour', $1))::INTEGER) / EXTRACT(epoch FROM $2)::INTEGER) * EXTRACT(epoch FROM $2)::INTEGER) $BODY$ LANGUAGE SQL STABLE; SELECT date_round_down('2017-06-02 16:39:35', '15 minutes') -- 2017-06-02 16:30:35
источник