sql >> データベース >  >> RDS >> PostgreSQL

PostgreSQLタイムスタンプタイプでタイムゾーンを保持する

    すでにご存知のとおり、タイムゾーン timestamptzでも、Postgresの日付/時刻タイプではまったく保存されません 。その役割は、それぞれ単なる入力修飾子または出力デコレータです。値(時点)のみが保存されます。この関連する回答の十分な詳細:

    • RailsとPostgreSQLでタイムゾーンを完全に無視する

    したがって、入力文字列のその部分を保持する場合は、文字列から抽出して自分で保存する必要があります。次のようなテーブルを使用します:

    CREATE TABLE tstz
     ...
     , ts timestamp    -- without time zone
     , tz text
    )
    

    tztext 、数値のオフセットを保持できます タイムゾーンの略語も同様です 、またはタイムゾーンの名前

    難しいのは、パーサーが従うさまざまなルールすべてに従って、簡単に壊れない方法でタイムゾーン部分を抽出することです。独自の手順を作成する代わりに、パーサーに作業を行わせる 。このデモを検討してください:

    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文字列



    1. 同じサーバー上の複数のデータベース間でクエリを実行する

    2. データの配列を入力パラメータとしてOracleプロシージャに渡す

    3. SQLServerXML列の値をクエリするにはどうすればよいですか

    4. MariaDB LENGTHB()の説明