すでにご存知のとおり、タイムゾーン timestamptz
でも、Postgresの日付/時刻タイプではまったく保存されません 。その役割は、それぞれ単なる入力修飾子または出力デコレータです。値(時点)のみが保存されます。この関連する回答の十分な詳細:
- RailsとPostgreSQLでタイムゾーンを完全に無視する
したがって、入力文字列のその部分を保持する場合は、文字列から抽出して自分で保存する必要があります。次のようなテーブルを使用します:
CREATE TABLE tstz
...
, ts timestamp -- without time zone
, tz text
)
tz
、text
、数値のオフセットを保持できます タイムゾーンの略語も同様です 、またはタイムゾーンの名前 。
難しいのは、パーサーが従うさまざまなルールすべてに従って、簡単に壊れない方法でタイムゾーン部分を抽出することです。独自の手順を作成する代わりに、パーサーに作業を行わせる 。このデモを検討してください:
WITH ts_literals (tstz) AS (
VALUES ('2013-11-28 23:09:11.761166+03'::text)
,('2013-11-28 23:09:11.761166 CET')
,('2013-11-28 23:09:11.761166 America/New_York')
)
SELECT tstz
,tstz::timestamp AS ts
,right(tstz, -1 * length(tstz::timestamp::text)) AS tz
FROM ts_literals;
SQLフィドル。
T
の有無にかかわらず動作します 日付と時刻の間。重要なロジックは次のとおりです:
right(tstz, -1 * length(tstz::timestamp::text)) AS tz
パーサーが日付/時刻コンポーネントとして識別したものの長さをトリミングした後、タイムスタンプ文字列の残りを取得します。あなたが述べたように、これは入力が存在することに依存しています:
検証済みのISO8601文字列