web-dev-qa-db-ja.com

postgresでタイムゾーンを明示的に保持する

私はさまざまな ways の「見る」時間と、それをPostgresで適切にマッピングする方法についてかなりの調査を行ってきましたが、実際に何を使用するかはまだわかりません。いくつかの articles 推奨または persuade 日付をtimestamp with time zoneとして保存し、timestampとして保存することはできません。私は夏時間に特に苦労しています。

私の使用例は、「ヨーロッパ/ベルリン」タ​​イムゾーンの人だけからアクセスされる単純なエンドユーザー向けアプリケーションです。ユーザーは、作成および更新のタイムスタンプとともに保存される投稿を書き込みます。

ユーザーが2020-01-01T10:00:00+01に投稿を公開するとします。ユーザーが即日にその投稿を読んだ場合、posted on 1st of January at 10 amと表示されます。同じ記事が7月のベルリンでクリックされた場合でも、DSTに関係なくposted on 1st of January at 10 amと表示されます。

私の直感は現在、時刻をtimestamp without time zoneとして格納することです。それ以外の場合、Postgresはその時刻をUTCに変換し、そのように格納するためです。後で、投稿が公開された実際のタイムゾーンを参照することはできません。その場合、それはposted on 1st of January at 11 amと表示され(ベルリンが2時間進んでいるため)、著者を混乱させる可能性がありました。彼らが最初に投稿を公開した時間を確認します。

私の考えは正しいですか、そしてtimestamp with time zoneを使用しないコーナーケースの1つを見つけましたか、またはここで重要な何かを見逃していますか?

2
rsmidt

私の使用例は、「ヨーロッパ/ベルリン」タ​​イムゾーンの人だけからアクセスされる単純なエンドユーザー向けアプリケーションです。 [...]

私の直感は、時間をtimestamp without time zone [...]

後で、投稿が公開された実際のタイムゾーンを参照することはできません。

これは、誤解不幸なデータ型名に起因することを示しています:

  • timestamp without time zone(= timestamp
  • timestamp with time zone(= timestamptz

どちらでもないデータ型は、タイムゾーン情報をまったく格納しません。 timestamptzは、現在のセッションの timezone設定 を考慮に入れる input と出力ロジックを追加し、/からUTC時間に射影しますそれに応じて。

それが混乱したとしても、恥ずかしがらないでください。

あなたの特定の場合

Ifステートメントが信頼できる場合:

「ヨーロッパ/ベルリン」タ​​イムゾーンの人々からのみアクセスできます。

...次に、timestampを使用することもできます。付随するタイムゾーンを知っている。そして、入力と出力の間の変換はありません。あなたはその場でtimestamptzに変換することができます:

my_column AT TIME ZONE 'Europe/Berlin'

アプリが現在のスコープを超える場合、timestamptzに切り替えて、複数のタイムゾーンからの入力を簡単に促進するには、次のように変換します。

ALTER TABLE tbl ALTER col TYPE timestamptz
   USING my_column AT TIME ZONE 'Europe/Berlin'

タイムゾーン名 'Europe/Berlin'を使用してください、ハードコードされたオフセットではありませんDSTの変動に合わせて調整できません。 タイムゾーンの略語、これはハードコードされたオフセットの名前です-非常によくある誤解の1つです。

またはすぐにtimestmaptzを使用して、すべての不測の事態をカバーします。

いずれかの方法で、要求されたようにタイムゾーンを保持するには、それを明示的に(追加の列に)格納する必要があります。あなたはもはや「ヨーロッパ/ベルリン」と仮定することはできません。

関連:

1