【问题标题】:Postgresql TIMESTAMP and TIMESTAMPTZ: is there any difference in data stored?Postgresql TIMESTAMP 和 TIMESTAMPTZ:存储的数据有什么不同吗?
【发布时间】:2021-11-05 04:54:59
【问题描述】:

如果我继承了一个填充了TIMESTAMP 类型的Postgresql 数据库,并且觉得需要将它们全部转换为TIMESTAMPTZ 类型,那么这是一个简单的过程,只需要:

ALTER TABLE mytable ALTER COLUMN the_time_stamp TYPE TIMESTAMPTZ;

我有这样一个数据库,其中的所有时间戳都是在与我(和服务器)不同的时区创建的,因此它们似乎在内部存储为 TIMESTAMPTZ。也就是说,我有两个客户端(一个写入,一个读取,两者都不在 UTC 区域),当我读取时,写入 zone1 的时间戳在 zone2 中读取时是正确的,这意味着(对我而言)它们已被转换并且在写入和读取之间以 UTC 格式存储。这让我想知道:

  • 是否所有时间戳都以相同的格式存储在数据库中,唯一的区别在于处理输入/输出的方式(根据所连接客户端的时区)?

如果它是真的,这似乎是一个如此清晰和简单的陈述,但我找不到它清楚和/或简单地陈述......

【问题讨论】:

  • "我有两个客户端,它们都不在 UTC 时区" - 你是说这些客户端在它们的连接上设置了会话时区吗?
  • 说实话:我不确定 - 客户端编写是通过 Poco 库包装器;客户端读数是 psql。如前所述,我继承了这个数据库,其中的数据看起来还不错……但都是timestamp 格式,这已成为限制因素……

标签: postgresql


【解决方案1】:

在内部,timestamptimestamp with time zone 都以相同的方式存储:一个 8 字节整数,它是从 2000-01-01 00:00:00 开始的偏移量,以微秒为单位。

区别在于语义:timestamp with time zone 存储为 UTC 2000-01-01 午夜的偏移量,timestamp 不进行时区转换。

这意味着如果您更改数据类型,则必须重写表,因为参考点发生了变化。如果timezone参数设置为UTC,值不会改变,但是PostgreSQL没有优化避免这种情况下的表重写。

【讨论】:

  • 这是否意味着TIMESTAMP 值是相对于服务器的时区存储的,而TIMESTAMPTZ 是相对于UTC 存储的?这是基本的数据差异吗?每个都相对于不同的时间参考?因为如果没有到某个参考时区的这种转换,我不明白这两个不同的客户端如何支持正确的结果。
  • 你明白了。准确地说:timestamp 存储为在您插入值时处于活动状态的timezone 中 2000 年 1 月 1 日午夜的偏移量。
猜你喜欢
  • 2014-05-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-05-02
  • 2016-05-28
  • 1970-01-01
  • 2013-12-28
相关资源
最近更新 更多