【问题标题】:PostgreSQL: format interval as minutesPostgreSQL:格式间隔为分钟
【发布时间】:2011-03-28 12:15:13
【问题描述】:

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

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

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

【问题讨论】:

    标签: postgresql


    【解决方案1】:
    SELECT EXTRACT(EPOCH FROM '2 months 3 days 12 hours 65 minutes'::INTERVAL)/60;
    

    似乎有效。

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

    【讨论】:

    【解决方案2】:

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

    几年前,我写了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】:

      我实际上认为你不能不做一堆奇怪的事情(比如 to_char),因为分钟会在 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)
      

      【讨论】:

      • 谢谢。我知道我有什么问题,我正在寻找最优雅的解决方案。
      猜你喜欢
      • 1970-01-01
      • 2012-11-18
      • 1970-01-01
      • 2012-08-23
      • 2021-05-14
      • 2020-07-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多