Hacker News | 📄 原文链接 | 2026-09-29 收录

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,也就是同一个函数要连续调用两次。

🔑 核心要点

💡 金句

Postgres AT TIME ZONE 'UTC' does NOT do what you think it does. And why you may need to repeat AT TIME ZONE 'UTC' twice.
← 返回 Hacker News 首页