PostgreSQL选择now():: timestamp与默认的now():: timestamp不同

时间:2018-11-30 06:23:54

标签: postgresql timestamp utc current-time

在我的程序中,每个表都有一列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))

几乎同时我从pgAdmin运行函数now

SELECT now()

得到结果:

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

要在几秒钟内检查系统时间,我从终端运行timedatectl status并得到以下结果:

enter image description here

  

问题是为什么函数now()给出5小时的时间   从触发器运行时的差异或作为默认值时的差异   插入?

1 个答案:

答案 0 :(得分:1)

epoch将为您提供自纪元以来的秒数。正如the documentation所说:

  

epoch

     

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

由于您与UTC的时间差了5个小时,因此可以说明两者之间的区别。