执行NOW()函数获取当前时间时,可以获得日期和服务器所在的时区。很多服务器运行在UTC/GMT,如果用户也使用UTC/TMT,一切都会正常,但是一旦出现时区不匹配(无论是用户程序还是数据库服务或者其他方面),就会出错。因此需要指定。
NOW()返回带有时区的时间戳,但是如果使用timestamp[without timezone]列时,然后通过NOW()向这个列插入时,时区信息会自动删除:
=# create table test
(a int primary key, b timestamp withouttime zone);
=# select now(),pg_typeof(now());
now | pg_typeof
-------------------------------+--------------------------
2020-05-06 16:44:03.917735-07 | timestamp withtime zone
(1 row)
=# insert into testvalues
(1, '2020-05-06 16:44:03.917735-07');
=# select * fromtest;
a | b
---+----------------------------
1 | 2020-05-06 16:44:03.917735
(1 row)
=# show timezone;
TimeZone
------------
US/Pacific
我们可以看到列“b”中值没有了时区信息。这意味着存储的结果值是错误的,因为它不遵循用户将时间戳值作为UTC值的意向。我们可以通过now() at time one ‘utc’进行补救:
=# insert into test values
(2, (now() at time zone 'utc'));
=# select * fromtest;
a | b
---+----------------------------
1 | 2020-06-10 19:38:22.859175
(1 row)
https://postgresweekly.com/issues/368
本文分享自 yanzongshuaiDBA 微信公众号,前往查看
如有侵权,请联系 cloudcommunity@tencent.com 删除。
本文参与 腾讯云自媒体同步曝光计划 ,欢迎热爱写作的你一起参与!