これにはまず理解が必要です。ここで、PostgreSQL がタイムスタンプとタイムゾーンを処理する方法について包括的な回答を書きました:
Rails と PostgreSQL でタイムゾーンを完全に無視する
タイムゾーンを「持たない」ことはできません。type で操作できますtimestamp [without time zone]
が、クライアントにはまだタイムゾーンがあります。
あなたの声明:
timestamp without time zone
関数を使って(!)で行を挿入するとCURRENT_TIMESTAMP
……
はadjecto の矛盾です。(!)CURRENT_TIMESTAMP
を返します。timestamp with time zone
にキャストする (または自動的に強制する)timestamp [without time zone]
と、タイム ゾーン オフセットは適用されずに切り捨てられます。UTC の代わりに、(セッションの現在のタイム ゾーン設定が何であれ) 現地時間を取得します。検討:
SELECT CURRENT_TIMESTAMP AT TIME ZONE 'UTC'
,CURRENT_TIMESTAMP::timestamp
ローカル タイム ゾーンの設定が「UTC」または「ロンドン」のようなものでない限り、2 つの式は異なる値を返します。
タイム ゾーンで表示されるリテラル値を保存する場合は、次のいずれかを使用します。
SELECT CURRENT_TIMESTAMP::timestamp
,now()::timestamp
,LOCALTIMESTAMP;
UTC で表される時点を保存する場合は、次のいずれかを使用します。
SELECT CURRENT_TIMESTAMP AT TIME ZONE 'UTC'
,now() AT TIME ZONE 'UTC;