2017-12-19 11 views
0

データ型がtimestamp with time zoneのPostgreSQLテーブルにタイムスタンプが保存されています。私は彼らが実際にUTCで保存されていることを理解していますが、データベースはUS Central(CST/CDT)に設定されています。すべての記録はもともとアメリカ中部のタイムスタンプではなく、他のアメリカのタイムゾーンからのものでした。クエリを実行するときには、都市に基づいて正しい元のタイムゾーンを特定し、タイムスタンプをソースタイムゾーンに戻したいと思います。この部分は、手動で作成されたルックアップテーブルのセットで解決されます。 標準対にタイムゾーンの夏時間バージョンを変換するとき、私はこだわって何PostgreSQL Convert timestamptz

を知ることです。米国では、Standard - > Daylight on 3月の第2日曜日、0200時間(即座に0300になります)。 11月の第1日曜日、Daylight - > Standard at 0200。すぐに0100になります。最初の遷移は簡単です(date > spring_forward & hour > 2)。

しかし、その日は0100の本質的に2つのレコードが存在するため、2番目の遷移は困難です。 CDTの場合は1番目の0100、次にCSTの場合は2番目の(落ちた)0100です。明らかに、複製された0100をStandardとして変換したいが、1番目のものは変換したくないが、複雑なカウントのクエリがないとこれを行う方法がわからない。この問題は、PST & PDTの両方を含む「太平洋」などの「一般的な」タイムゾーンでPythonで解決されたようです。私はPostgreSQLの場合はこれと似ているとは思えませんが、https://www.postgresql.org/docs/7.2/static/timezones.htmlです。

タイムスタンプについては、元の都市を知っているので、タイムゾーンを適切な(標準と夏時間)のタイムゾーンに総称的に変換するにはどうすればよいですか?

+0

タイムゾーン '*ゾーン名からあなたのルックアップテーブル*'を選択することに固執します... –

答えて

0

あなたは自分で夏時間を心配する必要はありません。PostgreSQLにはすべてのスマートがあります。 AT TIME ZONE構文を使用します。

SELECT '2017-12-03 00:00:00 UTC' AT TIME ZONE 'America/Chicago'; 

     timezone  
--------------------- 
2017-12-02 18:00:00 
(1 row) 

結果はtimestamp without time zoneです:シカゴ時間にtimestamp with time zoneを変換するには

。ご覧のように、タイムスタンプは夏時間に正しく変換されました。

サポートされているタイムゾーンの一覧は、カタログビューpg_timezone_namesで確認できます。

+0

「アメリカ/シカゴ」はドキュメントとしては時間としてリストされていませんがゾーン。この(および他の)名前が文書化されている場所を教えてください。 –

+0

私はそれを答えに加えました。 –