2012-10-01 15 views
8

タイムゾーン情報を使用しないで、のデータをインポートする必要があります(ただし、インポートするデータの特定のタイムゾーンを知っています)が、データベースに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>'; 
+0

どのようにあなたのインポートを実行していますか?インポート中にタイムゾーンを割り当てることはできませんか? – ertx

+0

ヒントをお寄せいただきありがとうございます。私は自分の投稿を更新しましたが、セッションタイムゾーンを実行時にデータベース内の他のプロセスにどのような効果が設定されているのかよくわかりません。 – harbun

答えて

関連する問題