PostgreSQL select now()::timestamp 不同于默认的 now()::timestamp
PostgreSQL select now()::timestamp differs from default now()::timestamp
在我的程序中,每个 table 都有一列 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();
他们应该将当前时间作为长值写入 update/insert 的 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
得到了以下结果:
The question is why the function now() gives a time with 5 hours
difference when I run it from trigger or as a default value when
insert?
epoch
将为您提供自纪元以来的秒数。正如 the documentation 所说:
epoch
For timestamp with time zone
values, the number of seconds since 1970-01-01 00:00:00 UTC (can be negative)
由于您与 UTC 相差 5 小时,这就解释了差异。
在我的程序中,每个 table 都有一列 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();
他们应该将当前时间作为长值写入 update/insert 的 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
得到了以下结果:
The question is why the function now() gives a time with 5 hours difference when I run it from trigger or as a default value when insert?
epoch
将为您提供自纪元以来的秒数。正如 the documentation 所说:
epoch
For
timestamp with time zone
values, the number of seconds since 1970-01-01 00:00:00 UTC (can be negative)
由于您与 UTC 相差 5 小时,这就解释了差异。