Postgres: как вы округляете отметку времени вверх или вниз до ближайшей минуты? - PullRequest
67 голосов
/ 01 июня 2011

Существует ли функция postgresql, которая возвращает метку времени, округленную до ближайшей минуты? Входное значение является отметкой времени, а возвращаемое значение должно быть отметкой времени.

Ответы [ 4 ]

97 голосов
/ 01 июня 2011

Используйте встроенную функцию date_trunc(text, timestamp), например:

select date_trunc('minute', now())

Редактировать: Усекает до самой последней минуты.Чтобы получить округленный результат, сначала добавьте 30 секунд к отметке времени, например:

select date_trunc('minute', now() + interval '30 second')

Возвращает ближайшую минуту.

См. Функции и операторы Postgres Date / Time для получения дополнительной информации

13 голосов
/ 22 января 2012

Ответ на аналогичный (и более общий) вопрос:

"... до ближайшего минутного интервала " (1 минута, 5 минут, 10-минут и т. д.)

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.

5 голосов
/ 30 марта 2012

Пытаясь использовать приведенный выше ответ Питера для создания функций потолка и пола, я обнаружил, что при вызове функции округления необходимо учитывать и секунды. Вот мои наборы функций, которые будут округлять метки времени, метки пола и потолка.

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;
3 голосов
/ 02 июня 2017

, чтобы округлить отметку времени

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...