PostgreSQL插入指定时区的timestamp with time zone为何转为默认时区存储?
为什么插入的带时区时间会被转为UTC存储?
PostgreSQL 的 timestamp with time zone(简称 timestamptz)类型不会存储你输入时指定的时区信息,它的工作逻辑是:
- 接收带时区的时间值后,会自动将其转换为 UTC(协调世界时)时间戳进行存储。你插入的
2010-10-10 10:10:10.000000 +03:00对应的UTC时间就是2010-10-10 07:10:10.000000 +00:00,这就是你看到的存储值。 - 当你查询该字段时,PostgreSQL 会根据当前会话的
timezone参数,把UTC时间转换回对应时区的时间格式展示。比如执行以下命令后查询:
你就能看到和插入时一致的SET timezone = '+03:00'; SELECT date_time FROM owner;2010-10-10 10:10:10.000000 +03:00。
如果需要保留原始的时区信息,你需要额外添加一个字段来存储时区标识,比如:
ALTER TABLE owner ADD COLUMN tz varchar; INSERT INTO owner(date_time, tz) VALUES (timestamp with time zone '2010-10-10 10:10:10.000000 +03:00', '+03:00');
内容的提问来源于stack exchange,提问作者Anton Kozub
相关产品推荐
相关产品推荐

