PostgreSQL alter type timestamp without time zone -> with time zone

Posted

技术标签:

【中文标题】PostgreSQL alter type timestamp without time zone -> with time zone【英文标题】: 【发布时间】:2012-04-04 02:16:55 【问题描述】:

问题很简单:如果我已经在没有时区的列类型时间戳中有数据,如果我将类型设置为带时区的时间戳,postgresql 对这些数据做了什么?

【问题讨论】:

你是对的,但在我启动我的应用程序/db/whatever 之前,答案可能会到来。 @a_horse_with_no_name 因为“它工作一次”是一种非常糟糕的方式来知道它每次都会做什么! @couling:所以你的意思是如果多次运行同一组语句会产生不同的结果?即使所有输入参数都相同?在那种情况下,dbhenur 的回答不会证明任何事情,因为根据您的说法,运行该语句一次并不能保证下次它会以同样的方式工作。 我不是在暗示我是在陈述它。请参阅给定的答案!会话的time zone 会影响结果。我已经看到人们将查询放入 SQL 窗口(在命令行上)并给出了一个结果,他们在他们的应用程序中使用它并给出了另一个结果(由于他们的个人资料切换时区而没有他们知道)。 更进一步。考虑一个没有ORDER BY 子句的SQL 查询。返回的行顺序是官方未定义的; RDBMS 只会以最简单的顺序返回它们。我看到开发人员错误地认为他们可以依靠最旧的行(自更新以来最长的行)首先出现。他们相信这一点仅仅是因为他们“只是尝试过”。 ...debenhur 的回答是正确的,即使他的理由并不充分。参考手册会更好。 【参考方案1】:

它将当前值保留在本地时间并将时区设置为本地时间的偏移量:

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的手册:

如果省略[USING 子句],则默认转换与从旧数据类型到新数据类型的赋值转换相同。

根据Date/Time types的手册

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

【讨论】:

是的。此行为与从没有时区的时间戳转换为有时区的时间戳完全相同。如果您想要不同的东西,您可以使用ALTER COLUMN column TYPE type USING <expression> 并使用时间函数来处理时区。 postgresql.org/docs/current/static/functions-datetime.html【参考方案2】:

最好明确指定时区。比如说,如果你的时间戳应该是 UTC (但没有时区),你应该警惕客户端或服务器的时区可能会在这里搞砸一切。而是写:

ALTER TABLE a ALTER COLUMN t TYPE TIMESTAMP WITH TIME ZONE USING t AT TIME ZONE 'UTC'

【讨论】:

以上是关于PostgreSQL alter type timestamp without time zone -> with time zone的主要内容,如果未能解决你的问题,请参考以下文章

postgresql: alter system

如何在 Postgresql 中使用 ALTER 将 VARCHAR 类型更改为 DATETIME?

PostgreSQL ALTER TABLE 命令

PostgreSQL ALTER TABLE 命令

PostgreSQL ALTER TABLE 命令

13.PostgreSQL Alter,Truncate Table