跳到主要内容

PostgreSQL 日期时间类型教程

日期时间类型有 DATE(日期)、TIME(时间)、TIMESTAMP(时间戳)、TIMESTAMPTZ(带时区时间戳)和 INTERVAL(时间间隔)。生产环境优先使用 TIMESTAMPTZ。

本篇内容​

  • DATE / TIME / TIMESTAMP / TIMESTAMPTZ
  • 时区的影响与 now() / CURRENT_DATE
  • INTERVAL 与常用日期函数
  • 字面量写法与 ISO 8601

基本类型​

CREATE TABLE events (
-- 仅日期
event_date DATE NOT NULL,
-- 不带时区的时间戳(存什么是什么,不做转换)
created_naive TIMESTAMP,
-- 带时区:内部按 UTC 存储,展示时按会话时区转换
created_at TIMESTAMPTZ NOT NULL DEFAULT now()
);

INSERT INTO events (event_date, created_at)
VALUES ('2026-10-24', '2026-10-24 08:00:00+08');

INTERVAL 与常用函数​

-- 时间间隔
SELECT now() + INTERVAL '7 days';
SELECT now() - INTERVAL '1 month 2 hours';

-- 截断到月 / 提取字段
SELECT date_trunc('month', created_at) FROM events;
SELECT extract(year FROM created_at), extract(dow FROM created_at) FROM events;

-- 计算年龄
SELECT age(created_at), created_at::DATE FROM events;
待补充(TODO)
  • 补充:TIMESTAMP vs TIMESTAMPTZ 的选型(为什么推荐 TZ)
  • 补充:时区设置(timezone)与 AT TIME ZONE 转换写法
  • 补充:日期范围查询的索引友好写法(避免对列套函数)
  • 补充:常用日期函数速查(date_trunc / generate_series / to_char)