代码之家  ›  专栏  ›  技术社区  ›  Konrad Garus

PostgreSQL:将间隔格式化为分钟

  •  23
  • Konrad Garus  · 技术社区  · 14 年前

    当我减去时间戳时,间隔的格式是DD:HH:MM:SS。我怎样才能把它全部转换成分钟 无需提取天数和小时数以及乘法/加法 date_part 在这个查询中,它返回65:

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

    3 回复  |  直到 14 年前
        1
  •  77
  •   Milen A. Radev    14 年前
    SELECT EXTRACT(EPOCH FROM '2 months 3 days 12 hours 65 minutes'::INTERVAL)/60;
    

    似乎有用。

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

        2
  •  4
  •   IMSoP    6 年前

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

    几年前,我写过 an interval_convert function 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;
    
        3
  •  -3
  •   a_horse_with_no_name    6 年前

    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)