当前位置:首页 > 虚拟主机 > 正文

pg数据库中日期函数有哪些常用函数及使用场景?

在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提供了多种函数用于日期、时间、字符串等类型之间的转换,确保数据在不同场景下的兼容性。

pg数据库中日期函数有哪些常用函数及使用场景? 第1张

  • 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数据库中日期函数有哪些常用函数及使用场景? 第2张

日期加减计算

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关键字可用于范围查询。

pg数据库中日期函数有哪些常用函数及使用场景? 第3张

示例

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'

注意事项

  1. 时区问题:CURRENT_TIMESTAMP和NOW()返回带时区的时间戳,而LOCALTIMESTAMP和CURRENT_TIME返回不带时区的时间戳,需根据业务需求选择。
  2. 字符串格式匹配:使用TO_DATE或TO_TIMESTAMP时,字符串格式必须与format参数完全匹配,否则会报错。
  3. 日期范围限制: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日

0