-- 直接使用字符串插入,PG会自动转换INSERT INTO your_table (create_time) VALUES ('2026-05-18 11:05:17');-- 也可以使用标准函数INSERT INTO your_table (create_time) VALUES (NOW());INSERT INTO your_table (create_time) VALUES (CURRENT_TIMESTAMP);
---
二、其他相关类型对比
类型 | 存储内容 | 适用场景 | 不适用场景 |
| timestamp without time zone | 本地日期 + 时间,无时区信息 | 所有用户在同一时区、只关心本地时间的场景(如国内单区域系统) | 跨时区应用、需要处理不同时区用户的场景 |
| timestamp with time zone (简称 timestamptz) | UTC 时间戳 + 时区偏移 | 跨时区应用、全球用户系统、需要准确记录时间点的场景 | 只需要本地时间、不需要时区转换的场景 |
| date | 仅日期(YYYY-MM-DD) | 只需要记录日期、不需要时间的场景(如生日、订单日期) | 需要精确到时分秒的场景 |
| time without time zone | 仅时间(HH:MM:SS) | 只需要记录时间、不需要日期的场景(如每日定时任务时间) | 需要完整日期时间的场景 |
| varchar/text | 字符串形式的日期时间 | 绝对不推荐 | 所有需要日期时间计算、排序、索引的场景 |
---
三、关键注意事项
1. 绝对不要用 varchar 存储日期时间
这是最常见的错误做法,会导致:
无法使用 PG 强大的日期时间函数(如 DATE_TRUNC、AGE、EXTRACT)
排序错误(字符串排序 2026-05-18 会排在 2026-05-2 前面)
索引失效,查询性能极差
数据格式不统一,容易出现脏数据
2. timestamp vs timestamptz 核心区别
存储方式
:两者都占用 8 字节,timestamptz 实际存储的是 UTC 时间戳
显示方式
:timestamptz 会根据数据库或客户端的时区自动转换显示
推荐原则
:
3. 关于 datetime 类型
PostgreSQL 虽然支持 datetime 类型,但这是为了兼容 MySQL 而保留的别名,本质上和 timestamp without time zone 完全一样。官方推荐直接使用timestamp。
---
四、最佳实践总结
存储 2026-05-18 11:05:17 这种格式
:使用 timestamp without time zone
需要跨时区处理
:使用 timestamp with time zone
只需要日期
:使用 date
设置默认值
:推荐使用 CURRENT_TIMESTAMP 自动记录创建时间
避免使用
:varchar、text、datetime(别名)
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!