你是不是经常遇到需要处理日期和时间的应用?比如在线下单、日程安排、数据库变更历史——这些都离不开正确存储时间。PostgreSQL 给我们提供了很强大的工具来搞定这些数据,别担心,时间表可不是一堆乱七八糟的小时和分钟,而是让你能分析和整理事件的清晰结构。
日期和时间类型可以让你:
- 只存日期
DATE,只存时间TIME,或者两者一起TIMESTAMP。 - 做各种操作,比如加天数、算日期差、按时间条件筛选记录。
- 支持时区操作(不过这个以后再讲)。
数据类型:DATE、TIME、TIMESTAMP
DATE 数据类型
DATE 类型就是只存日期,不带时间。它会记录年、月、日。啥时候用它比较合适:
- 比如要存用户的生日。
- 只关心事件发生哪天,不在乎具体几点。
格式示例:YYYY-MM-DD(年-月-日)。
例子:
| id | name - VARCHAR(100) | event_date - DATE |
|---|---|---|
| 1 | SQL Workshop | 2025-06-15 |
| 2 | Python | 2025-06-17 |
| 3 | Java Courses | 2025-06-25 |
TIME 数据类型
TIME 类型就是只存时间。啥时候用它:
- 比如要存作息表,比如上班开始时间。
- 只关心几点几分,不在乎哪天。
格式示例:HH:MI:SS(小时:分钟:秒)。
例子:
| id | task_name - VARCHAR(100) | start_time - TIME |
|---|---|---|
| 1 | Team Meeting | 09:00:00 |
| 2 | Code Review | 11:30:00 |
| 3 | Client Call | 15:00:00 |
TIMESTAMP 数据类型
TIMESTAMP 就是日期和时间的组合。啥时候用它:
- 比如要记录某个时刻,比如用户登录系统的时间。
- 需要时间戳来追踪变化(日志)。
格式示例:YYYY-MM-DD HH:MI:SS(年-月-日 小时:分钟:秒)。
例子:
| id | action - VARCHAR(100) | login_time - TIMESTAMP |
|---|---|---|
| 1 | User Login | 2023-10-15 14:30:00 |
| 2 | File Uploaded | 2023-10-15 15:10:00 |
| 3 | User Logout | 2023-10-15 16:45:00 |
日期和时间的操作
现在知道有这些类型了,咱们来看看怎么用。PostgreSQL 自带了很多内置函数,能让你轻松搞定日期和时间的各种操作。
提取日期和时间的部分
如果你有个时间戳(TIMESTAMP),想只拿出年份、月份、天数或者小时,用 EXTRACT 函数就行。
例子:
SELECT EXTRACT(YEAR FROM TIMESTAMP '2025-06-15 14:30:00') AS year;
-- 结果: 2025
SELECT EXTRACT(MONTH FROM TIMESTAMP '2025-06-15 14:30:00') AS month;
-- 结果: 06
SELECT EXTRACT(DAY FROM TIMESTAMP '2025-06-15 14:30:00') AS day;
-- 结果: 15
加减时间间隔
想知道一周后是啥时候?或者昨天是哪天?用 interval 操作就行。
例子:
-- 给当前日期加7天
SELECT CURRENT_DATE + INTERVAL '7 days' AS next_week;
-- 减去1个月
SELECT CURRENT_DATE - INTERVAL '1 month' AS last_month;
日期比较
怎么判断事件是不是已经发生?比找 bug 还简单——直接比大小就行。
例子:
SELECT event_date
FROM events
WHERE event_date < CURRENT_DATE;
-- 选出所有已经过去的事件
更多关于时间和日期函数的内容,咱们后面还会讲。现在你只要记住有这些类型就够了。
时区问题和时间标准
虽然这节课还不细讲时区,但得提一句,PostgreSQL 支持 TIMESTAMPTZ(带时区的时间戳)类型。比如 2023-10-15 14:30:00+02,就表示这个时间属于 UTC+2 时区。
我们后面肯定会详细讲这个话题,别急 :P
例子
现在来实操一下,检验下刚学的知识。我们来建个表,专门存学生的课程表。
| id | subject_name | class_date - DATE | start_time - TIME | end_time - TIME | created_at - TIMESTAMP |
|---|---|---|---|---|---|
| 1 | Mathematics | 2023-10-16 | 09:00:00 | 10:30:00 | 2023-10-12 14:00:00 |
| 2 | Physics | 2023-10-16 | 11:00:00 | 12:30:00 | 2023-10-12 14:00:00 |
| 3 | Chemistry | 2023-10-17 | 09:00:00 | 10:30:00 | 2023-10-12 14:01:00 |
| 4 | Literature | 2023-10-17 | 11:00:00 | 12:30:00 | 2023-10-12 14:01:00 |
| 5 | Computer Science | 2023-10-18 | 10:00:00 | 11:30:00 | 2023-10-12 14:02:00 |
再过几节课你就能用 SQL 语句自己建这种表了。现在先欣赏一下吧 :)
常见错误
日期和时间格式: 插入数据时一定要用对格式:日期用 YYYY-MM-DD,时间用 HH:MI:SS。PostgreSQL 如果你写成 "15/10/2023" 可能就不认了。
数据类型不匹配: 想往 DATE 字段塞文本会报错。
时间间隔错误: 比如你给二月加30天,PostgreSQL 会自动算,但结果可能已经到三月了。
现在你已经了解了 PostgreSQL 里处理日期和时间的数据类型。在实际项目里,这能帮你搞定课程表、事件日志、系统重要事件追踪啥的!
GO TO FULL VERSION