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 zone 和 timestamp 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的主要内容,如果未能解决你的问题,请参考以下文章