问题很简单:如果我已经在没有时区的列类型timestamp中有数据,如果我将类型设置为带有时区的timestamp,postgresql会如何处理这些数据?

推荐答案

它将当前值保留为localtime,并将时区设置为localtime的偏移量:

create table a(t timestamp without time zone, t2 timestamp with time zone);
insert into a(t) values ('2012-03-01'::timestamp);
update a set t2 = t;
select * from a;
          t          |           t2           
---------------------+------------------------
 2012-03-01 00:00:00 | 2012-03-01 00:00:00-08

alter table a alter column t type timestamp with time zone;
select * from a;
           t            |           t2           
------------------------+------------------------
 2012-03-01 00:00:00-08 | 2012-03-01 00:00:00-08

根据Alter Table年的手册:

如果省略[the USING clause is],默认转换与从旧数据类型转换为新数据类型的赋值转换相同.

根据Date/Time types年的手册

timestamp without time zonetimestamp with time zone之间的转换通常假定timestamp without time zone值应作为或给定为timezone本地时间.可以使用AT TIME ZONE为转换指定不同的时区.

Postgresql相关问答推荐

Postgres SQL执行加入

PostgreSQL解释分析实际时间不加总

在Docker Compose中获取CSV文件数据?

Postgres-pgloader-默认情况下,在PostgreSQL中将列名转换为小写

为什么32632投影中的几何图形并不完美?

使用jOOQ在postgres上取消嵌套enum_range

使用postgres在go测试容器中使用tern迁移

Rust中使用sqlx的多线程postgres操作的惯用方法是什么?

安装age-installation时出错

在 postgres/presto/AWS-Athena 中,与 array_agg( (col1, col2) ) 相反的是什么来获得每组多行?

配置:错误:C 编译器无法在 Ubuntu 中创建可执行文件

Rails 迁移:PostgreSQL 上的 Bigint 似乎失败了?

安装 pg gem 失败,mkmf.rb 找不到 ruby​​ 的头文件(Mac OSX 10.6.5)

为 postgresql 存储过程设置隔离级别

仅在存在时重命名列

错误:prepared statement "S_1" already exists

如何使 array_agg() 像 mySQL 中的 group_concat() 一样工作

如何将 Heroku PG 转储导入本地机器

我应该在 Django DATABASE ENGINE 中使用哪个 Postgres 值?

PostgreSQL - GROUP BY 子句或用于聚合函数