PGSQL日期函数报价
- 虚拟主机
- 2025-12-23
- 7
在PostgreSQL(PGSQL)中,日期函数是处理日期和时间数据的核心工具,广泛应用于数据分析、报表生成、业务逻辑实现等场景,本文将详细介绍PGSQL中常用的日期函数,包括其语法、功能及实际应用示例,帮助开发者高效操作日期数据。
基础日期函数
获取当前日期和时间
-
CURRENT_DATE:返回当前日期(不含时间部分)。
示例:SELECT CURRENT_DATE;
输出:20251015(假设当前日期为2025年10月15日)。
-
CURRENT_TIME:返回当前时间(不含日期部分)。
示例:SELECT CURRENT_TIME;
输出:14:30:00(假设当前时间为14:30:00)。
-
CURRENT_TIMESTAMP:返回当前日期和时间(含时区信息)。
示例:SELECT CURRENT_TIMESTAMP;
输出:20251015 14:30:00+08(时区可能因环境而异)。

日期截取函数
-
DATE_TRUNC(unit, date):按指定单位截取日期或时间。
参数unit支持year、month、day、hour、minute等。
示例:SELECT DATE_TRUNC('month', CURRENT_DATE);
输出:20251001(截取到月初)。
-
EXTRACT(unit FROM date):提取日期中的特定部分(年、月、日等)。
示例:SELECT EXTRACT(YEAR FROM CURRENT_DATE);
输出:2025。
-
date + interval:在日期上添加时间间隔。
示例:SELECT CURRENT_DATE + INTERVAL '7 days';
输出:20251022(当前日期加7天)。
-
date interval:在日期上减去时间间隔。
示例:SELECT CURRENT_DATE INTERVAL '1 year';
输出:20251015(当前日期减1年)。
-
AGE(date):计算两个日期之间的间隔。
示例:SELECT AGE(CURRENT_DATE, '20200101');
输出:3 years 9 months 14 days。
- date1 date2:直接计算两个日期的天数差。
示例:SELECT CURRENT_DATE '20250101';
输出:288(假设当前日期为2025年10月15日)。
- TO_CHAR(date, format):将日期格式化为字符串。
示例:SELECT TO_CHAR(CURRENT_DATE, 'YYYYMMDD');
输出:20251015。
常用格式化符号:
- YYYY:四位年份
- MM:两位月份
- DD:两位日期
- Day:星期名称(如Monday)
-
TO_DATE(string, format):将字符串转换为日期。
示例:SELECT TO_DATE('20251015', 'YYYYMMDD');
输出:20251015。

-
CAST(string AS DATE):直接转换(需符合默认格式)。
示例:SELECT CAST('20251015' AS DATE);
输出:20251015。
-
NEXT_DAY(date, day):返回指定日期之后的第一个星期几。
示例:SELECT NEXT_DAY(CURRENT_DATE, 'Monday');
输出:20251016(假设当前日期为2025年10月15日,周日)。
-
LAST_DAY(date):返回指定日期所在月的最后一天。
示例:SELECT LAST_DAY(CURRENT_DATE);
输出:20251031。
- CONVERT_TIMEZONE(source_tz, target_tz, timestamp):转换时区。
示例:SELECT CONVERT_TIMEZONE('UTC', 'Asia/Shanghai', CURRENT_TIMESTAMP);
输出:20251015 22:30:00+08(假设UTC时间为14:30:00)。
- 按月统计订单量: SELECT DATE_TRUNC('month', order_date) AS month, COUNT(*) FROM orders GROUP BY month;
- 计算会员到期提醒: SELECT member_name, expiry_date FROM members WHERE expiry_date <= CURRENT_DATE + INTERVAL '30 days';
- 避免在WHERE子句中对日期列使用函数:如WHERE DATE_TRUNC('day', order_date) = '20251015'会导致索引失效,建议改写为WHERE order_date >= '20251015' AND order_date < '20251016'。
- 合理使用索引:对频繁查询的日期列创建索引,如CREATE INDEX idx_order_date ON orders(order_date);。
日期计算函数
日期加减运算
日期差值计算
日期格式化与转换
日期格式化
字符串转日期
高级日期函数
工作日计算
时区处理
实际应用场景
报表统计
业务逻辑
日期函数性能优化建议
常见日期函数对比表
| 函数名 | 功能 | 示例 | 输出 |
|---|---|---|---|
| CURRENT_DATE | 获取当前日期 | SELECT CURRENT_DATE; | 20251015 |
| DATE_TRUNC | 截取日期单位 | SELECT DATE_TRUNC('year', '20251015'); | 20250101 |
| EXTRACT | 提取日期部分 | SELECT EXTRACT(MONTH FROM '20251015'); | 10 |
| TO_CHAR | 格式化日期 | SELECT TO_CHAR('20251015', 'DD/MM/YYYY'); | 15/10/2025 |
| AGE | 计算日期间隔 | SELECT AGE('20251015', '20200101'); | 3 years 9 mons 14 days |
相关问答FAQs
Q1: 如何在PGSQL中计算两个日期之间的工作日数(排除周末)?
A1: 可以使用自定义函数结合generate_series实现,示例代码如下:
CREATE OR REPLACE FUNCTION working_days(start_date DATE, end_date DATE) RETURNS INT AS $$ DECLARE days INT := 0; current_date DATE := start_date; BEGIN WHILE current_date <= end_date LOOP EXTRACT(DOW FROM current_date) NOT IN (0, 6) THEN days := days + 1; END IF; current_date := current_date + INTERVAL '1 day'; END LOOP; RETURN days; END; $$ LANGUAGE plpgsql; SELECT working_days('20251001', '20251015'); 输出:11个工作日
Q2: 如何将Unix时间戳转换为PostgreSQL日期格式?
A2: 使用TO_TIMESTAMP函数将Unix时间戳(秒级)转换为timestamp类型,再通过TO_CHAR格式化,示例:
SELECT TO_CHAR(TO_TIMESTAMP(1697376000), 'YYYYMMDD HH24:MI:SS') AS formatted_date; 输出:20251015 00:00:00
