web-dev-qa-db-ja.com

タイムゾーンなしのNow()

タイプ_added_at_の列_timestamp without time zone_があります。デフォルト値を現在の日時にしたいのですが、タイムゾーンはありません。関数now()もタイムゾーンを返します。

どうすればその問題を解決できますか?

56
アレックス
SELECT now()::timestamp

それで全部です。キャストはタイムスタンプをタイムゾーンの現在のタイムスタンプに変換します。 標準SQL関数LOCALTIMESTAMP がPostgresで実装される方法でもあります。

複数のタイムゾーンで操作しない場合は、正常に機能します。それ以外の場合は、added_attimestamptzに切り替えます。違い?

63

次のようなことができます:

_SELECT now() AT TIME ZONE current_setting('TimeZone');
SELECT now() AT TIME ZONE 'Europe/Paris';
SELECT now() AT TIME ZONE 'UTC';
_

列 "added_at"にどのように意味があるかわかりません。ほとんどの場合、浮動タイムスタンプではなく絶対タイムスタンプ(タイムゾーン付きタイムスタンプ)が必要です。


以下のポイントへの応答を編集します。

  1. はい。理由がない限り、タイムゾーン(絶対時間)のタイムスタンプを使用する必要があります。

  2. クライアントのタイムゾーンは、上記のように_SHOW TimeZone_またはcurrent_setting(...)で指定されます。

マニュアルをざっと読むのに少し時間をかけてください-それらはすべてこれを非常にうまくカバーしています。

35
Richard Huxton

"現在の日付/時刻"

CURRENT_TIMEおよびCURRENT_TIMESTAMPは、タイムゾーン付きの値を提供します。 LOCALTIMEおよびLOCALTIMESTAMPは、タイムゾーンなしで値を配信します。

17
Milen A. Radev