Есть ли функция postgresql, которая вернет отметку времени, округленную до ближайшей минуты? Входное значение - это метка времени, а возвращаемое значение должно быть меткой времени.
Postgres: как вы приближаетесь к отметке времени вверх или вниз до ближайшей минуты?
Ответ 1
Используйте встроенную функцию date_trunc(text, timestamp)
, например:
select date_trunc('minute', now())
Изменить: Это усекает до последней минуты. Чтобы получить округленный результат, сначала добавьте 30 секунд в метку времени, например:
select date_trunc('minute', now() + interval '30 second')
Это возвращает ближайшую минуту.
Подробнее о Функции и операторы даты и времени Postgres для получения дополнительной информации
Ответ 2
Ответ на аналогичный (и более общий) вопрос,
"... до ближайшего минутного интервала" (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.
Ответ 3
Пытаясь ответить на вопрос Питера, чтобы создать функции потолка и пола, я обнаружил, что при вызове функции округления нужно учитывать и секунды. Здесь представлены мои функции, которые будут иметь круглые, полные и потолочные метки.
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;
Ответ 4
округлить отметку времени
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