postgresで間隔を時間数に変換するにはどうすればよいですか?


161

次のような間隔があるとしましょう

4 days 10:00:00

postgresで。これを時間数(この場合は106)に変換するにはどうすればよいですか。関数はありますか。

extract(days, my_interval) * 24 + extract(hours, my_interval)

9
注:間隔に月または年が含まれる場合、月または年の日数は異なるため、何時間あるかについての明確な回答はありません。だから気をつけて!
テディ

回答:


313

おそらく最も簡単な方法は次のとおりです。

SELECT EXTRACT(epoch FROM my_interval)/3600

6
また、間隔に分や秒が含まれている場合は、結果をフロアまたは整数にキャストすることもできます
rasjani

64
エポックを抽出しますか?ああ、それは100万年後には私の心を超えなかっただろう。
2009年

4
SELECT EXTRACT(epoch FROM my_interval / 3600)(間隔にはネイティブの「整数除算」サポートがあり、結果は間隔であり、抽出結果は浮動小数点数ではなく整数です)。そう。オートキャスト/フロア完了。
Offenso

19
警告:エポックを単純に抽出すると、1か月= 30日、1年= 365.25日と暗黙的に想定されます。
テディ

@テディ私たちはそれで何ができますか?この問題を回避して実際のエポック数を取得するにはどうすればよいですか?
Asmox

18

整数、つまり日数が必要な場合:

SELECT (EXTRACT(epoch FROM (SELECT (NOW() - '2014-08-02 08:10:56')))/86400)::int

すごい!:)それでもありがとうございます。ただし、引数を1つだけ使用すると自動的に使用されるため、これをSELECT extract('epoch' FROM age('2014-08-02'::timestamp)) / 86400(Pg 9.4を使用して)に変更できることがわかりました。age(ts)CURRENT_DATE
1111161171159459134

7
警告:エポックを単純に抽出すると、1か月= 30日、1年= 365.25日と暗黙的に想定されます。
テディ

3

日数を取得するには、最も簡単な方法は次のとおりです。

SELECT EXTRACT(DAY FROM NOW() - '2014-08-02 08:10:56');

私の知る限り、それは同じ結果を返します:

SELECT (EXTRACT(epoch FROM (SELECT (NOW() - '2014-08-02 08:10:56')))/86400)::int;

27
間隔がの場合'1 month 0 days'、を使用extract(day from …)すると0結果が得られます。
Underyx 2017年

1
select floor((date_part('epoch', order_time - '2016-09-05 00:00:00') / 3600)), count(*)
from od_a_week
group by floor((date_part('epoch', order_time - '2016-09-05 00:00:00') / 3600));

::int変換は、丸めの原則に従っています。切り捨てなどの別の結果が必要な場合は、などの対応する数学関数を使用できますfloor


1

テーブルフィールドを変換する場合:

  1. 秒を含むようにフィールドを定義します。

     CREATE TABLE IF NOT EXISTS test (
         ...
         field        INTERVAL SECOND(0)
     );
  2. 値を抽出します。他の方法でキャストすることを忘れないでください。間隔が大きくなると、不愉快な驚きを得ることができます。

    EXTRACT(EPOCH FROM field)::int


RedshiftがINTERVALデータ型をサポートしているとは思いません。BIGINTだけです。
matt2000

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.