TEXT型カラムの値をINTERVAL型に変換し、その値を別のINTERVAL型カラムに代入する方法
環境: PostgreSQL9.4
現在、0秒〜2日までの時間データを保持するのに、TEXT型カラムdurationへ次のような文字列を保存するようにしています。
- PT10S
- PT1H10M20S
- P1D
このフォーマットはISO8601に準拠している為、例えば次のようにEXTRACT()を使い変換できます。
postgres=# SELECT EXTRACT(EPOCH FROM INTERVAL 'PT1M10S');
date_part
-----------
70
(1 row)
これをソートする必要が出てきたのですが、文字列のままでは正しくソートされないので、これを次の手順でINTERVAL型に変えることにしました。
- INTERVAL型の新しいカラムduration_tmpを作成
- 全レコードのdurationの値をEXTRACT()で変換し、その値をduration_tmpに代入
- 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);
^
どのようにすれば良いでしょうか?