1

私のプログラムでは、すべてのテーブルに列がありますlast_modified:

last_modified int8 DEFAULT (date_part('epoch'::text, now()::timestamp) * (1000)::double precision) NOT NULL

更新のために、トリガーを追加しました:

CREATE OR REPLACE FUNCTION sync_lastmodified() RETURNS trigger AS $$
BEGIN
  NEW.last_modified := (date_part('epoch'::text, now()::timestamp) * (1000)::double precision);

  RETURN NEW;
END;
$$ LANGUAGE plpgsql;

CREATE TRIGGER
  sync_lastmodified
BEFORE UPDATE ON
  ourtable
FOR EACH ROW EXECUTE PROCEDURE
  sync_lastmodified();

last_modified更新/挿入時に現在の時刻を長い値として列に書き込む必要があります。しかし、期待どおりに機能していません。

問題を再現するために、更新を行い、次のものを取得しました。

last_modified value equals 1543576224455 (Friday November 30, 2018 16:10:24 (pm) in time zone Asia/Tashkent (+05))

ほぼ同時にnow、pgAdmin から関数を実行します。

SELECT now()

そして結果を得ました:

2018-11-30 11:10:36.891426+05

数秒以内にシステム時間を確認するためにtimedatectl status、ターミナルから実行したところ、次の結果が得られました。

ここに画像の説明を入力

問題は、関数 now() が、トリガーから実行したとき、または挿入時にデフォルト値として実行したときに、なぜ 5 時間の差を与えるのかということです。

4

1 に答える 1