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

1

epoch会给你自纪元以来的秒数。正如文档所说:

epoch

对于timestamp with time zone值,自 1970-01-01 00:00:00 UTC 以来的秒数(可以是负数)

由于您与 UTC 相差 5 小时,这就解释了差异。

于 2018-11-30T06:51:53.097 回答