PostgreSQL:格式间隔为分钟

Kon*_*rus 27 postgresql

当我减去时间戳时,间隔的形式为DD:HH:MM:SS.如何在不提取日期和小时以及乘法/加法的情况下将其全部转换为分钟?我正在寻找一个我可以date_part在此查询中替换的单个函数,以便它返回65:

select date_part('minutes', '65 minutes'::interval);
Run Code Online (Sandbox Code Playgroud)

上下文:我需要知道自给定时间戳以来已经过了多少分钟.

Mil*_*dev 52

SELECT EXTRACT(EPOCH FROM '2 months 3 days 12 hours 65 minutes'::INTERVAL)/60;
Run Code Online (Sandbox Code Playgroud)

似乎工作.

警告:"似乎"是关键词.


IMS*_*SoP 7

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

几年前,我编写了一个interval_convert函数,将其推广到 接受的大多数参数date_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;
Run Code Online (Sandbox Code Playgroud)