【问题标题】:How to convert an interval like "1 day 01:30:00" into "25:30:00"?如何将“1 天 01:30:00”等间隔转换为“25:30:00”?
【发布时间】:2010-09-25 09:04:26
【问题描述】:

我需要添加一些间隔并在 Excel 中使用结果。

自从

sum(time.endtime-time.starttime)

将间隔返回为“1 天 01:30:00”,这种格式破坏了我的 Excel 工作表,我认为有像“25:30:00”这样的输出会很好,但没有办法做到这一点在 PostgreSQL 文档中。

这里有人可以帮帮我吗?

【问题讨论】:

    标签: postgresql formatting intervals


    【解决方案1】:

    由于该主题没有确切的解决方案:

    => SELECT date_part('epoch', INTERVAL '1 day 01:30:00') * INTERVAL '1 second' hours;
      hours
    -----------
     25:30:00
    (1 row)
    

    来源:Documentation

    【讨论】:

    • 太棒了!理想的解决方案。
    【解决方案2】:

    我唯一能想到的(除了解析天数和每次加 24 小时)是:

    mat=> select date_part('epoch', '01 day 1:30:00'::interval);
     date_part 
    -----------
         91800
    (1 row)
    

    它会给你秒数,这对于excel来说可能没问题。

    【讨论】:

    • 好东西。我需要某种从间隔中获取绝对值的方法,我需要的第一步是将间隔“转换”为秒,这就是诀窍:) SELECT * FROM table ORDER BY abs(date_part('epoch',('2011-07-19 02:40:05' - table.time)))
    【解决方案3】:

    您可以使用EXTRACT 将时间间隔转换为秒。

    SELECT EXTRACT(EPOCH FROM INTERVAL '5 days 3 hours');
    Result: 442800
    

    那么你需要自己做数学(或者让 Excel 来做)。

    请注意,“1 天”不一定等同于“24 小时” - PostgreSQL 处理诸如跨越 DST 转换的间隔之类的事情。

    【讨论】:

    • 在带时区的 (timestamp|date|time) 中,是的,但是,嗯,时间间隔不知道何时发生,因此,它没有 DST 转换或闰秒含义。
    • osm=> 选择 '2008-03-29T02:00:05+0200'::timestamptz + '1 天'::interval; ?柱子? ------------------------ 2008-03-30 01:00:05+01 (1 行)
    • 我不能对此事具有权威性,但似乎 Postgres 将间隔存储为一组字段,而不仅仅是转换为显示的整数。根据应用的位置,它将被解释为不同的秒数。剥夺它的上下文意味着它必须做出假设。
    【解决方案4】:

    如果您希望 postgres 为您处理 HH:MM:SS 格式,请获取以纪元秒为单位的差异并将其转换为以秒为单位的间隔:

    SELECT SUM(EXTRACT(EPOCH FROM time.endtime) - EXTRACT(EPOCH FROM time.starttime))
             * INTERVAL '1 SECOND' AS hhmmss
    

    【讨论】:

    • 非常微妙。这会将时间间隔从天、小时、分钟、秒更改为仅几秒,之后您可以执行to_char(xxx, 'HH24:MI:SS')
    【解决方案5】:

    在标准 SQL 中,您希望将类型表示为 INTERVAL HOUR TO SECOND,但您有一个 INTERVAL DAY TO SECOND 类型的值。您不能使用 CAST 来获得所需的结果吗?在 Informix 中,符号可以是:

    SUM(time.endtime - time.starttime)::INTERVAL HOUR(3) TO SECOND
    
    CAST(SUM(time.endtime - time.starttime) AS INTERVAL HOUR(3) TO SECOND)
    

    前者是,AFAIK,Informix 特定的表示法(或者,至少,不是标准的);我相信后者是 SQL 标准表示法。

    【讨论】:

      【解决方案6】:

      可以做到,但我相信唯一的办法就是通过下面的怪物(假设你的时间间隔列名称是“ti”):

      select
                    to_char(floor(extract(epoch from ti)/3600),'FM00')
          || ':' || to_char(floor(cast(extract(epoch from ti) as integer) % 3600 / 60), 'FM00')
          || ':' || to_char(cast(extract(epoch from ti) as integer) % 60,'FM00')
          as hourstamp
      from whatever;
      

      看到了吗?我告诉过你这太可怕了:)

      这样想就好了

      select to_char(ti,'HH24:MI:SS') as hourstamp from t
      

      会起作用,但可惜的是,HH24 格式不会“吸收”超过 24 的溢出。以上内容(从内存中重构)来自我曾经编写的一些代码。为免得罪体质娇弱者,我将以上恶作剧概括为一个观点……

      【讨论】:

        猜你喜欢
        • 2019-11-08
        • 2020-07-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-06-26
        • 1970-01-01
        • 1970-01-01
        • 2011-02-08
        相关资源
        最近更新 更多