主要观点:Postgres 提供两种存储时间戳的方式TIMESTAMP和TIMESTAMP 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 本身也推荐使用该方式。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用。你还可以使用@来通知其他用户。