web-dev-qa-db-ja.com

「1日01:30:00」のような間隔を「25:30:00」に変換する方法は?

いくつかの間隔を追加して、Excelで結果を使用する必要があります。

以来

sum(time.endtime-time.starttime)

間隔を「1日01:30:00」として返し、この形式ではExcelシートが壊れます。「25:30:00」のような出力があればいいと思いましたが、PostgreSQLでそれを行う方法が見つかりませんでしたドキュメンテーション。

ここの誰かが私を助けることができますか?

20
Ole

トピックの正確な解決策がないため:

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

ソース: ドキュメント

18
zaratustra

私が持って来ることができる唯一のもの(日数を解析し、毎回時間に24を追加する以外に)は:

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

それはあなたに秒数を与えるでしょう、それはExcelのために大丈夫かもしれません。

21
mat

EXTRACTを使用して、間隔を秒に変換できます。

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

次に、独自の計算を行う必要があります(またはExcelに実行させる)。

「1日」は必ずしも「24時間」と同等ではないことに注意してください。PostgreSQLはDST移行にまたがる間隔などを処理します。

18
slim

PostgresがHH:MM:SSのフォーマットを処理するようにしたい場合は、エポック秒単位の差を取り、それを秒単位でスケーリングされた間隔に変換します。

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

それは可能ですが、唯一の方法は次の怪物を経由することだと思います(時間間隔の列名が "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を超えるオーバーフローを「吸収」しません。上記は(メモリから再構築された)私がかつて書いたコードからのものです。デリケートな体質の人を怒らせないように、私は上記のシェナニガンをビューにカプセル化しました...

0
dland

標準SQLでは、タイプをINTERVAL HOUR TO SECONDとして表したいが、タイプINTERVAL DAY TOSECONDの値があります。 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標準表記だと思います。

0