Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/postgresql/9.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,当我减去时间戳时,间隔的形式是DD:HH:MM:SS。我怎样才能在不提取天、小时和乘法/加法的情况下将其全部转换为分钟?我正在寻找一个函数,我可以在这个查询中用它代替date\u part,以便它返回65: select date_part('minutes', '65 minutes'::interval); 上下文:我需要知道从给定的时间戳到现在已经过去了多少分钟。事实上,我认为如果不做一些奇怪的事情(比如去查),你是不可能做到的,因为分钟是59分钟。这就是为什么你会得到: postgre

当我减去时间戳时,间隔的形式是DD:HH:MM:SS。我怎样才能在不提取天、小时和乘法/加法的情况下将其全部转换为分钟?我正在寻找一个函数,我可以在这个查询中用它代替
date\u part
,以便它返回65:

select date_part('minutes', '65 minutes'::interval);

上下文:我需要知道从给定的时间戳到现在已经过去了多少分钟。

事实上,我认为如果不做一些奇怪的事情(比如去查),你是不可能做到的,因为分钟是59分钟。这就是为什么你会得到:

postgres=# select date_part('minutes', '65 minutes'::interval);
 date_part 
-----------
         5
(1 row)

postgres=# select '65 minutes'::interval
postgres-# ;
 interval 
----------
 01:05:00
(1 row)
似乎有效


警告:“似乎”是关键词。

正如前面的答案所指出的,诀窍是将间隔转换为“历元”,即绝对秒数,然后适当地除以其他单位的绝对数

几年前,我写了一篇文章,将这一点推广到
date\u part
接受的大多数论点,假设一个月是30天,一年是365.25天

您可以随意使用和修改:

CREATE FUNCTION 
    interval_convert(in_unit text, in_interval interval) 
    RETURNS double precision
AS $FUNC$
    SELECT
        EXTRACT(
            EPOCH FROM
            $2 -- in_interval 
        )
        /
        -- Slightly lazy way of allowing both singular and plural
        --  has side effect that 'centurie' and 'centurys' are accepted
        --  but otherwise behaves similarly to DATE_TRUNC
        CASE TRIM(TRAILING 's' FROM LOWER(
            $1 -- in_unit
        ))
            WHEN 'microsecond'  THEN 0.000001 
            WHEN 'millisecond'  THEN 0.001
            WHEN 'second'       THEN 1
            WHEN 'minute'       THEN 60
            WHEN 'hour'         THEN 3600
            WHEN 'day'          THEN 86400
            WHEN 'week'         THEN 604800
            WHEN 'month'        THEN 2592000 -- 30 days
            -- WHEN 'quarter'      THEN -- Not supported
            WHEN 'year'         THEN 31557600 -- 365.35 days
            WHEN 'decade'       THEN 315576000
            WHEN 'century'      THEN 3155760000
            WHEN 'centurie'     THEN 3155760000
            WHEN 'millennium'   THEN 31557600000
            WHEN 'millennia'    THEN 31557600000
        END
$FUNC$
    LANGUAGE sql 
    IMMUTABLE 
    RETURNS NULL ON NULL INPUT;

谢谢我知道我有什么问题,我正在寻找最优雅的解决方案。是的。“epoch”返回秒数。谢谢
CREATE FUNCTION 
    interval_convert(in_unit text, in_interval interval) 
    RETURNS double precision
AS $FUNC$
    SELECT
        EXTRACT(
            EPOCH FROM
            $2 -- in_interval 
        )
        /
        -- Slightly lazy way of allowing both singular and plural
        --  has side effect that 'centurie' and 'centurys' are accepted
        --  but otherwise behaves similarly to DATE_TRUNC
        CASE TRIM(TRAILING 's' FROM LOWER(
            $1 -- in_unit
        ))
            WHEN 'microsecond'  THEN 0.000001 
            WHEN 'millisecond'  THEN 0.001
            WHEN 'second'       THEN 1
            WHEN 'minute'       THEN 60
            WHEN 'hour'         THEN 3600
            WHEN 'day'          THEN 86400
            WHEN 'week'         THEN 604800
            WHEN 'month'        THEN 2592000 -- 30 days
            -- WHEN 'quarter'      THEN -- Not supported
            WHEN 'year'         THEN 31557600 -- 365.35 days
            WHEN 'decade'       THEN 315576000
            WHEN 'century'      THEN 3155760000
            WHEN 'centurie'     THEN 3155760000
            WHEN 'millennium'   THEN 31557600000
            WHEN 'millennia'    THEN 31557600000
        END
$FUNC$
    LANGUAGE sql 
    IMMUTABLE 
    RETURNS NULL ON NULL INPUT;