Postgres : 타임 스탬프를 가장 가까운 분으로 올림 또는 내림하는 방법은 무엇입니까?


87

가장 가까운 분으로 반올림 된 타임 스탬프를 반환하는 postgresql 함수가 있습니까? 입력 값은 타임 스탬프이고 반환 값은 타임 스탬프 여야합니다.

답변:


136

내장 함수를 사용하십시오. date_trunc(text, timestamp)예를 들면 다음과 같습니다.

select date_trunc('minute', now())

편집 : 가장 최근 분으로 잘립니다 . 반올림 된 결과 를 얻으려면 먼저 타임 스탬프에 30 초를 추가합니다. 예를 들면 다음과 같습니다.

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

가장 가까운 분을 반환합니다 .

자세한 내용은 Postgres 날짜 / 시간 함수 및 연산자 를 참조하세요.


20
간격의 절반을 더한 다음 자르는 현명한 트릭에 +1합니다.
Jan KS

14

유사하고 더 일반적인 질문에 답하십시오.

"... 가장 가까운 분 간격으로 "(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 보여준대로 "정확한 라운드"와에.


6

위의 Peter의 대답을 사용하여 천장 및 바닥 함수를 만들려고 할 때 반올림 함수를 호출 할 때 초도 고려해야한다는 것을 알았습니다. 이것은 반올림, 바닥 및 천장 타임 스탬프가 될 함수 세트입니다.

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;

수정 (!) 및 확장 덕분에 이제 완전한 "근사 분"라이브러리가 생겼습니다. PS : int DEFAULT 5가장 빈번한 사용을 단순화하기 위해 (두 번째 매개 변수)를 추가 할 수 있다고 생각합니다 .
피터 크라우스

Ops, 또 다른 문제 : LANGUAGE SQL IMMUTABLE.
Peter Krauss 2014

3

타임 스탬프를 반올림하려면

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

내가 기대했던 생각하는,하지만 그것은 35초 아래로 라운드하지 않습니다
Moody_Mudskipper

나는 이것을 사용하여 2 시간마다 반올림했습니다. 작동하지 않습니다.
jpro
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.