pg数据库中日期函数有哪些常用函数及使用场景?
- 虚拟主机
- 2025-12-20
- 7
在PostgreSQL(简称PG)数据库中,日期函数是处理日期和时间数据的核心工具,能够帮助用户高效地进行日期计算、格式化、提取以及比较等操作,这些函数广泛应用于数据分析、报表生成、业务逻辑处理等场景,掌握它们对于数据库开发和数据管理至关重要,本文将详细介绍PG数据库中常用的日期函数,包括其功能、语法、使用示例及注意事项,帮助用户全面理解并灵活运用这些函数。
基础日期获取与当前时间处理
在PG中,获取当前日期和时间是最常见的操作,常用的函数包括CURRENT_DATE、CURRENT_TIME、CURRENT_TIMESTAMP和NOW()。
- CURRENT_DATE:返回当前日期(不包含时间部分),类型为date,例如20251001。
- CURRENT_TIME:返回当前时间(不包含日期部分),类型为time,例如14:30:00。
- CURRENT_TIMESTAMP:返回当前日期和时间,包含时区信息,类型为timestamp with time zone,例如20251001 14:30:00+08。
- NOW():与CURRENT_TIMESTAMP功能完全一致,返回当前日期和时间(含时区),是开发中最常用的函数之一。
示例:
SELECT CURRENT_DATE AS today, CURRENT_TIME AS now_time, NOW() AS full_time;
执行结果可能为:
| today | now_time | full_time |
||||
| 20251001 | 14:30:00 | 20251001 14:30:00+08 |
日期与时间戳的转换
PG提供了多种函数用于日期、时间、字符串等类型之间的转换,确保数据在不同场景下的兼容性。

- DATE(date):将timestamp或text类型的值转换为date类型。
- TIMESTAMP(date):将date或text类型的值转换为timestamp类型(不含时区)。
- TO_CHAR(date, format):将日期/时间戳格式化为指定格式的字符串,format支持多种格式化模板,如YYYY(四位年份)、MM(两位月份)、DD(两位日期)、HH24(24小时制)等。
- TO_DATE(text, format):将字符串按指定格式解析为date类型。
- TO_TIMESTAMP(text, format):将字符串按指定格式解析为timestamp类型。
示例:
1. 将当前时间戳转换为日期 SELECT TIMESTAMP '20251001 14:30:00'::date AS date_only; 结果:20251001 2. 格式化日期为字符串 SELECT TO_CHAR(NOW(), 'YYYY年MM月DD日 HH24时MI分SS秒') AS formatted_time; 结果:2025年10月01日 14时30分00秒 3. 将字符串解析为日期 SELECT TO_DATE('20251001', 'YYYYMMDD') AS parsed_date; 结果:20251001
日期部分提取与计算
提取日期中的特定部分(如年、月、日、星期等)或进行日期加减运算是高频操作,PG通过EXTRACT、DATE_PART函数以及运算符实现。
提取日期部分
- EXTRACT(field FROM date):从日期中提取指定字段,支持YEAR(年)、MONTH(月)、DAY(日)、HOUR(小时)、MINUTE(分钟)、SECOND(秒)、DOW(星期几,0为周日)、DOY(一年中的第几天)等。
- DATE_PART(text, date):功能与EXTRACT类似,但参数顺序相反,更易读。
示例:
SELECT EXTRACT(YEAR FROM NOW()) AS year, EXTRACT(MONTH FROM NOW()) AS month, EXTRACT(DOW FROM NOW()) AS day_of_week, 0=周日,1=周一,...,6=周六 DATE_PART('day', NOW()) AS day_of_month;
假设当前日期为20251001(周日),结果为:
| year | month | day_of_week | day_of_month |
|||||
| 2025 | 10 | 0 | 1 |

日期加减计算
PG支持直接使用运算符对日期进行加减操作,可结合INTERVAL关键字实现年、月、日、时、分、秒的间隔计算。
示例:
1. 当前日期加10天 SELECT NOW() + INTERVAL '10 days' AS future_date; 2. 当前时间戳减3个月 SELECT NOW() INTERVAL '3 months' AS past_date; 3. 日期加减年、月、日、时分秒的组合 SELECT DATE '20250101' + INTERVAL '1 year 2 months 15 days' AS new_date;
结果示例:
| future_date | past_date | new_date |
||||
| 20251011 14:30:00+08 | 20250701 14:30:00+08 | 20250316 |
日期比较与条件判断
日期比较常用于筛选数据、判断时间范围,PG支持直接使用比较运算符(, >, <, >=, <=, <>)对日期类型进行比较。AGE(date, date)函数可计算两个日期之间的间隔,BETWEEN关键字可用于范围查询。

示例:
1. 查询订单表中创建时间在2025年1月1日之后的订单 SELECT order_id, create_time FROM orders WHERE create_time > '20250101'; 2. 计算当前日期与订单创建时间的间隔 SELECT order_id, create_time, AGE(NOW(), create_time) AS time_diff FROM orders; 3. 查询创建时间在2025年10月1日至2025年10月7日之间的订单 SELECT order_id FROM orders WHERE create_time BETWEEN '20251001' AND '20251007';
AGE函数返回interval类型,结果如1 year 2 mons 3 days,可通过EXTRACT进一步提取具体数值。
常用日期函数归纳表
为方便查阅,以下将PG中核心日期函数按功能分类归纳:
| 功能分类 | 函数/语法 | 说明 | 示例 |
|---|---|---|---|
| 获取当前时间 | NOW() / CURRENT_TIMESTAMP | 返回当前日期时间(含时区) | SELECT NOW(); |
| 获取当前日期 | CURRENT_DATE | 返回当前日期(无时间) | SELECT CURRENT_DATE; |
| 类型转换 | TO_CHAR(date, format) | 日期格式化为字符串 | TO_CHAR(NOW(), 'YYYYMMDD') |
| TO_DATE(text, format) | 字符串解析为日期 | TO_DATE('20251001', 'YYYYMMDD') | |
| 提取日期部分 | EXTRACT(field FROM date) | 提取年、月、日等字段 | EXTRACT(YEAR FROM NOW()) |
| 日期计算 | date + INTERVAL 'N unit' | 日期加减指定间隔 | NOW() + INTERVAL '7 days' |
| 日期间隔 | AGE(date1, date2) | 计算两个日期的间隔 | AGE(NOW(), '20250101') |
| 时区处理 | AT TIME ZONE 'timezone' | 转换时区 | NOW() AT TIME ZONE 'UTC' |
注意事项
- 时区问题:CURRENT_TIMESTAMP和NOW()返回带时区的时间戳,而LOCALTIMESTAMP和CURRENT_TIME返回不带时区的时间戳,需根据业务需求选择。
- 字符串格式匹配:使用TO_DATE或TO_TIMESTAMP时,字符串格式必须与format参数完全匹配,否则会报错。
- 日期范围限制:PG的日期范围支持4713 BC至5874897 AD,超出范围的操作可能引发错误。
相关问答FAQs
Q1: 如何在PG中查询两个日期之间的月份数?
A1: 可通过EXTRACT(MONTH FROM AGE(date1, date2))提取间隔的月份数,但需注意AGE函数会计算完整的月份差(不足1个月的部分不计)。
SELECT EXTRACT(MONTH FROM AGE('20251001', '20250101')) AS months_diff; 结果:9
Q2: 如何将日期格式化为“YYYY年MM月DD日”并确保月份和日期为两位数?
A2: 使用TO_CHAR函数,格式模板中MM和DD会自动补零。
SELECT TO_CHAR(NOW(), 'YYYY"年"MM"月"DD"日"') AS formatted_date; 结果:2025年10月01日