Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/postgresql/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Postgresql 博士后:如何将时间戳向上或向下舍入到最近的一分钟?_Postgresql - Fatal编程技术网

Postgresql 博士后:如何将时间戳向上或向下舍入到最近的一分钟?

Postgresql 博士后:如何将时间戳向上或向下舍入到最近的一分钟?,postgresql,Postgresql,是否有一个postgresql函数可以返回四舍五入到最近一分钟的时间戳?输入值是时间戳,返回值应该是时间戳。使用内置函数date\u trunc(文本,时间戳),例如: select date_trunc('minute', now()) select date_trunc('minute', now() + interval '30 second') 编辑:这将截短到最近一分钟。要获得舍入结果,请先在时间戳上加30秒,例如: select date_trunc('minute', now(

是否有一个postgresql函数可以返回四舍五入到最近一分钟的时间戳?输入值是时间戳,返回值应该是时间戳。

使用内置函数
date\u trunc(文本,时间戳)
,例如:

select date_trunc('minute', now())
select date_trunc('minute', now() + interval '30 second')
编辑:这将截短到最近一分钟。要获得舍入结果,请先在时间戳上加30秒,例如:

select date_trunc('minute', now())
select date_trunc('minute', now() + interval '30 second')
这将返回最近的分钟数

有关更多信息,请参见

对类似(更一般)问题的回答

“…至最近的分钟间隔”(1分钟、5分钟、10分钟等)


根据@CrowMagnumb显示的“精确舍入”进行改编。

在尝试使用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;

将时间戳四舍五入

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

感谢更正(!)和扩展:现在我们有了一个完整的“大约分钟”库。PS:我想你可以添加一个
int DEFAULT 5
(第二个参数)来简化最频繁的使用。Ops,另一个问题:使用
语言SQL IMMUTABLE
+1来巧妙地增加一半的时间间隔,然后进行截断。虽然它不会将35秒的时间舍入,我想这是意料之中的。我试着用它每两小时轮换一次。不起作用。