Postgres 的 AT TIME ZONE UTC 并不做你以为的事 — Hacker News 中文摘要
来源:bookofrevenue.com — 121 分 · by shayonj
📋 概述
这篇文章针对一个非常常见的时区陷阱:在 Postgres 里写 AT TIME ZONE UTC 并不只是"切换时区",它会把数据类型从 timestamptz 转换成 timestamp——也就是丢掉时区信息、不再代表现实世界中的一个时间点。作者用月度环比图表的 JOIN 作例子演示后果:2026-02-28 16:00:00-08 加上一个月会得到 2026-03-28 16:00:00-08,因为加"一个月"本身是时区相关的操作,而机器默认时区是 PT 却按 UTC 业务理解。更隐蔽的是,timestamp 与 timestamptz 直接比较永远返回 false,但用 EXTRACT EPOCH FROM 时两者又给出相同数值,让问题极难察觉。修复方式是把结果再用一次 AT TIME ZONE UTC 转回 timestamptz,也就是同一个函数要连续调用两次。
🔑 核心要点
AT TIME ZONE UTC 的真正作用是把 timestamptz 转成 timestamp,而不是切换显示时区。