Postgres:タイムスタンプを最も近い分に切り上げるまたは切り下げるにはどうすればよいですか?


83

最も近い分に丸められたタイムスタンプを返すpostgresql関数はありますか?入力値はタイムスタンプであり、戻り値はタイムスタンプである必要があります。

回答:


130

組み込み関数を使用します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(2番目のパラメーター)を追加して、最も頻繁に使用することを単純化できると思います。
ピータークラウス2014

Ops、別の問題:を使用しますLANGUAGE SQL IMMUTABLE
ピータークラウス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.