Postgres 的 <code>带时区的时间戳</code>的简单解释

主要观点:Postgres 提供两种存储时间戳的方式TIMESTAMPTIMESTAMP WITH TIME ZONE(或timestamptz),应推荐使用后者以避免时区相关问题。
关键信息

  • “timestamp”是特定时间点,比较需包含参考时间,时区可管理参考时间。
  • 无时区的timestamp(如TIMESTAMP)存储时不编码时区信息,依赖会话或服务器时区,易受时区设置影响。
  • 有时区的timestamp(如TIMESTAMP WITH TIME ZONE)能明确显示时区偏移,值不受时区设置影响。
  • 即使始终保持在 UTC 时区,TIMESTAMP WITHOUT TIME ZONE也可能因时区设置改变而出错,而TIMESTAMP WITH TIME ZONE不会。
    重要细节
  • 通过 SQL 语句创建临时表演示两种方式的存储及时区影响,如创建no_tz表和tz_test表。
  • 展示改变会话时区后无时区timestamp值的变化,以及有时区timestamp值的稳定性。
  • 提到 Rails 开发者可通过配置让 Active Record 默认使用TIMESTAMP WITH TIME ZONE,且 Postgres 本身也推荐使用该方式。
阅读 13
0 条评论