【问题标题】:PostgreSQL alter type timestamp without time zone -> with time zonePostgreSQL 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 的回答是正确的,即使他的理由并不充分。参考手册会更好。

标签: postgresql timezone


【解决方案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'

【讨论】:

    猜你喜欢
    • 2011-03-14
    • 2021-11-12
    • 2020-09-20
    • 2023-01-10
    • 1970-01-01
    • 2021-08-24
    • 1970-01-01
    • 2013-10-26
    • 1970-01-01
    相关资源
    最近更新 更多