環境: PostgreSQL9.4

現在、0秒〜2日までの時間データを保持するのに、TEXT型カラムdurationへ次のような文字列を保存するようにしています。

  • PT10S
  • PT1H10M20S
  • P1D

このフォーマットはISO8601に準拠している為、例えば次のようにEXTRACT()を使い変換できます。

postgres=# SELECT EXTRACT(EPOCH FROM INTERVAL 'PT1M10S');
date_part
-----------
        70
(1 row)

これをソートする必要が出てきたのですが、文字列のままでは正しくソートされないので、これを次の手順でINTERVAL型に変えることにしました。

  1. INTERVAL型の新しいカラムduration_tmpを作成
  2. 全レコードのdurationの値をEXTRACT()で変換し、その値をduration_tmpに代入
  3. durationを削除し、duration_tmpの名前をdurationに変更

この2. の方法が分からず困っています。一度次のようなコマンドを打ったのですがうまくいきません。

postgres=# UPDATE my_table SET duration_tmp = EXTRACT(EPOCH FROM INTERVAL duration);
ERROR:  syntax error at or near "duration"
LINE 1: ...le set duration_tmp = EXTRACT(EPOCH FROM INTERVAL duration);
                                                             ^

どのようにすれば良いでしょうか?