पोस्टग्रेज: आप एक टाइमस्टैम्प को ऊपर या निकटतम मिनट तक कैसे गोल करते हैं?


87

क्या कोई पोस्टग्रैस्क्ल फ़ंक्शन है जो निकटतम मिनट में गोल किए गए टाइमस्टैम्प को वापस करेगा? इनपुट मान एक टाइमस्टैम्प है और रिटर्न वैल्यू एक टाइमस्टैम्प होना चाहिए।

जवाबों:


136

date_trunc(text, timestamp)उदाहरण के लिए, अंतर्निहित फ़ंक्शन का उपयोग करें :

select date_trunc('minute', now())

संपादित करें: यह सबसे हाल के मिनटों को काटता है। एक गोल परिणाम प्राप्त करने के लिए , पहले टाइमस्टैम्प में 30 सेकंड जोड़ें, उदाहरण के लिए:

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

यह निकटतम मिनट लौटाता है ।

अधिक जानकारी के लिए Postgres Date / Time Functions और Operators देखें


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

छत और फर्श के कार्यों को बनाने के लिए ऊपर दिए गए पीटर के उत्तर का उपयोग करने की कोशिश में मैंने पाया कि आपको राउंडिंग फ़ंक्शन को कॉल करते समय सेकंड को भी ध्यान में रखना होगा। यह मेरे कार्यों के सेट हैं जो गोल, फर्श और छत टाइमस्टैम्प होंगे।

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
पीटर क्रूस

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
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.