PGSQL日期函数如何按条件提取特定时间段数据?
- 虚拟主机
- 2025-12-20
- 7
PostgreSQL(简称PGSQL)提供了丰富的日期函数,用于处理和操作日期、时间以及时间戳数据,这些函数可以帮助用户轻松实现日期计算、格式化、提取组件等操作,满足各种业务场景的需求,以下是PGSQL中常用日期函数的详细介绍及使用示例。

在PGSQL中,日期和时间数据类型主要包括DATE(仅日期)、TIME(仅时间)、TIMESTAMP(日期和时间)和INTERVAL(时间间隔),日期函数通常与这些类型结合使用,以下是核心函数的分类说明:
当前日期时间获取函数
- CURRENT_DATE:返回当前日期(不包含时间部分),类型为DATE。
示例:SELECT CURRENT_DATE; → 输出如20251001。
- CURRENT_TIME:返回当前时间(不包含日期部分),类型为TIME。
示例:SELECT CURRENT_TIME; → 输出如14:30:00。
- CURRENT_TIMESTAMP:返回当前日期和时间,类型为TIMESTAMP。
示例:SELECT CURRENT_TIMESTAMP; → 输出如20251001 14:30:00。
- NOW():功能与CURRENT_TIMESTAMP相同,常用于查询中记录操作时间。
日期格式化函数
- TO_CHAR(date, text):将日期/时间转换为指定格式的字符串。
示例:TO_CHAR(CURRENT_DATE, 'YYYYMMDD') → 输出20251001;
TO_CHAR(CURRENT_TIMESTAMP, 'YYYY年MM月DD日 HH24:MI:SS') → 输出2025年10月01日 14:30:00。
常用格式化模板:YYYY(四位年份)、MM(月份)、DD(日期)、HH24(24小时制)、MI(分钟)、SS(秒)。
日期解析函数
- TO_DATE(text, text):将字符串转换为DATE类型。
示例:TO_DATE('20251001', 'YYYYMMDD') → 返回20251001。
- TO_TIMESTAMP(text, text):将字符串转换为TIMESTAMP类型。
示例:TO_TIMESTAMP('20251001 14:30:00', 'YYYYMMDD HH24:MI:SS') → 返回对应时间戳。
日期提取函数
提取日期/时间的特定部分,返回数值类型:

- EXTRACT(YEAR FROM date):提取年份。
- EXTRACT(MONTH FROM date):提取月份。
- EXTRACT(DAY FROM date):提取日期。
- EXTRACT(HOUR FROM timestamp):提取小时。
- 其他部分:MINUTE、SECOND、DOW(星期几,0为周日)等。
日期计算函数
- INTERVAL:用于日期加减运算。
示例:CURRENT_DATE + INTERVAL '1 day' → 明天的日期;
CURRENT_TIMESTAMP INTERVAL '2 hours' → 两小时前的时间。
- AGE(date1, date2):计算两个日期的间隔,返回interval类型。
示例:AGE(CURRENT_DATE, '20200101') → 返回3年9个月...。
- DATE_PART(text, date):与EXTRACT功能类似,返回指定部分的数值。
示例:DATE_PART('year', CURRENT_DATE) → 返回当前年份。
日期比较与截断函数
- TRUNC(date, text):截断日期到指定精度(如'month'、'year')。
示例:TRUNC(CURRENT_DATE, 'month') → 返回当月1日。
- 日期1 < 日期2:直接比较日期先后,返回布尔值。
以下表格归纳了常用日期函数及其功能:
| 函数名 | 功能描述 | 示例 |
|---|---|---|
| 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 CURRENT_DATE) |
| AGE(date1, date2) | 计算两个日期的间隔 | AGE(CURRENT_DATE, '20200101') |
| TRUNC(date, precision) | 截断日期到指定精度 | TRUNC(CURRENT_DATE, 'month') |
相关问答FAQs
Q1: 如何在PGSQL中计算两个日期之间的天数差?
A1: 可以使用EXTRACT函数或直接相减。
- 方法1:SELECT EXTRACT(DAY FROM AGE('20251010', '20251001')) AS days_diff;
- 方法2:SELECT ('20251010'::DATE '20251001'::DATE) AS days_diff;
两种方法均返回天数差9。
Q2: 如何将日期格式化为“YYYY年MM月DD日”的中文格式?
A2: 使用TO_CHAR函数,指定对应的格式模板:
SELECT TO_CHAR(CURRENT_DATE, 'YYYY"年"MM"月"DD"日"') AS chinese_date;
输出示例:2025年10月01日,模板中的双引号用于包裹普通字符(如“年”),使其原样输出。
