タイム ゾーン情報を含まないデータをインポートする必要があります (ただし、インポートするデータの特定のタイム ゾーンはわかっています) がtimestamp with time zone
、データベースにはその形式が必要です。インポートしてタイムスタンプ データ型を に設定するとtimestamp with time zone
、Postgres はテーブル内のデータが自分のタイム ゾーンからのものであると自動的に想定し、それに自分のタイム ゾーンを割り当てます。残念ながら、インポートしたいデータは私の時間枠のものではないため、これは機能しません。
データベースには、異なるタイム ゾーンのデータも含まれています。ただし、1 つのテーブル内のタイム ゾーンは常に同じです。
これで、データベースのタイム ゾーンを、データをインポートする前に (SET time zone
コマンドを使用して) インポートするデータのタイム ゾーンに設定し、インポートが完了したら自分のタイム ゾーンに戻すことができました。保存されたデータは、データベースのタイム ゾーンの変更の影響を受けません。しかし、これはかなり汚いアプローチのようで、後で問題を引き起こす可能性があります。
データ自体にタイム ゾーン データを含めずに、インポートのタイム ゾーンを指定するより洗練された方法があるのだろうか?
また、インポート後にタイム ゾーン情報を編集する方法が見つかりませんでした。テーブル全体に同じタイム ゾーン オフセットがあると仮定して (つまり、データ入力/インポート時に間違ったタイム ゾーンが割り当てられた場合)、テーブル全体のタイム ゾーンを変換せずに編集する方法はありますか?
編集:
インポート時にタイムゾーンを指定できました。コマンド全体は次のとおりです。
set session time zone 'UTC';
COPY tbl FROM 'c:\Users\Public\Downloads\test.csv' DELIMITERS ',' CSV;
set session time zone 'CET';
その後、データはセッションのタイム ゾーンを使用してインポートされます。これは、他の接続から同時にデータベース上の他のクエリに影響を与えないと思いますか?
編集2:
後でテーブルのタイムゾーンを変更する方法を見つけました:
PostgreSQL update time zone offset
インポート後にテーブルのタイムゾーンを変更してから、セッションを使用してローカルタイムゾーンを一時的に変更する方がエレガントだと思います。もちろん、テーブル全体のタイムゾーンが同じであると仮定します。
したがって、コードは次のようなものになります。
COPY tbl FROM 'c:\Users\Public\Downloads\test.csv' DELIMITERS ',' CSV;
UPDATE tbl SET <tstz_field> = <tstz_field> AT TIME ZONE '<correct_time_zone>';