PostgreSQL模式匹配与日期处理详解

Oliver
Oliver
发布时间:2026-10-13| 6人浏览过
原创

掌握PostgreSQL中的模式匹配与时间处理是优化查询的关键。本文深入解析 LIKE 与 SIMILAR TO 的通配符差异、substring 函数的截取技巧,并系统化梳理日期/时间格式化模板、算术操作符及 EXTRACT 等核心函数,为 SQL 开发提供实用的参考指南。

模式匹配实战

PostgreSQL 提供了三种主要的模式匹配方式:标准的 LKE、更贴近正则的 SIMILAR TO,以及 POSIX 风格正则表达式。理解它们的异同点能显著提升数据筛选的效率。

第一步:掌握 LIKE 操作符及其扩展

目的:使用标准 SQL 方式进行基础字符匹配,支持大小写忽略及自定义转义。

  • 基础语法:使用 string LIKE pattern [ESCAPE escape-character] 进行匹配。下划线 (_) 匹配单个任意字符,百分号 (%) 匹配零个或多个字符。
  • 特殊处理:若需匹配字面量的 _ 或 %,需使用转义字符(默认反斜杠)。可通过 ESCAPE '' 关闭转义机制,此时通配符功能保留但不可转义。
  • 大小写敏感:关键字 ILIKE 可实现不区分大小写的匹配(PostgreSQL 特有)。
  • 替代符号:~~ 等效于 LKE,~~* 等效于 ILIKE。
示例代码:
'abc' LIKE 'a%'        -- true
'abc' LIKE '_b_'       -- true
'abc' ILIKE 'ABC%'     -- true (不区分大小写)

第二步:使用 SIMILAR TO 实现正则逻辑

目的:在不完全使用复杂正则的前提下,利用类似正则的元字符(如 |, *, +)进行灵活的模式构造。

  1. 兼容通配符:继承 LIKE 的 _ 和 % 含义。
  2. 扩展元字符:支持 | (选择), * (零次或多次), + (一次或多次), () (分组) 及 [] (字符表)。
  3. 提取子串:可使用三参数形式的 substring(string from pattern for escape-char)。此模式下,模式必须匹配整个字符串才能成功,需通过双引号标记期望返回的部分。
示例代码:
-- 包含 b 或 d 的字符串
'abc' SIMILAR TO '%(b|d)%' -- true

-- substring 提取:#为转义符,双引号内为捕获内容
SELECT substring('foobar' from '%#"o_b#"%' FOR '#');
-- 结果: oob

数据类型格式化函数

PostgreSQL 内置了丰富的格式化函数,用于将日期、整数、浮点数等多种类型转换为格式化的字符串,反之亦然。其通用调用习惯为:第一个参数为待格式化值,第二个参数为定义输出模板的文本。

函数返回类型描述例子
to_char(timestamp, text)text把时间戳转换成字串to_char(current_timestamp, 'HH12:MI:SS')
to_date(text, text)date把字串转换成日期to_date('05 Dec 2000', 'DD Mon YYYY')
to_number(text, text)numeric把字串转换成numericto_number('12,454.8-', '99G999D9S')

在使用 to_char 时,需要了解以下两种核心模板:

日期/时间格式化模式

模式描述
HH / HH12一天的小时数 (01-12)
HH24一天的小时数 (00-23)
MI分钟 (00-59)
SS秒 (00-59)
YYYY年 (4位及以上)
MM月份号 (01-12)
Mon / MONTH缩写月份名 / 全长大写月份名

数值格式化模板模式

模式描述
9带指定位数的值
0带前导零的值
.小数点
, / G千位分隔符
D小数点占位符
L货币符号
PR尖括号内显示负值

时间与日期函数及操作符

PostgreSQL 提供了强大的时间运算能力,包括标准的四则运算操作符以及提取特定时间片段的系统函数。

时间/日期操作符速查

以下表格展示了日期、时间和间隔 (Interval) 之间的混合运算行为:

操作符例子结果类型
+date + intervaltimestamp
-date - integer (天数)date
-date - dateinteger (相差的天数)
-time - timeinterval
* / /interval * double / interval / doubleinterval

核心时间函数

常用的时间获取与处理函数如下:

函数返回类型描述例子结果
age(timestamp)interval计算从给定时间到当前的年龄age('1957-06-13')43 years 8 mons...
now()timestamp当前日期和时间now()2024-05-20 10:00:00
date_trunc(field, timestamp)timestamp截断到指定精度date_trunc('hour', ...)截去分秒

提取时间域:EXTRACT 与 date_part

这两个函数等效,均用于从 timestamp 或 interval 中提取特定的时间域。

域名称描述返回值范围
CENTURY世纪N/A
YEAR / YEAROF年份4位数年份
MONTH一年中的第几个月1-12
DAY一个月里的第几天1-31
HOUR / MINUTE / SECOND时分秒0-23 / 0-59 / 0-59
DOW星期几0(周日)-6
DOY一年中的第几天1-366
QUARTER季度1-4

以上就是 PostgreSQL 模式中匹配与日期处理的详细内容,更多关于 PostgreSQL 高级查询技巧的资料请关注本站其它相关文章!

相关标签:

免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。

Python 相关产品和应用

全部下载
Selenium

Selenium

4.51.0 · Windows

用于浏览器自动化和 Web 测试的 Python 工具。

scikit-learn

scikit-learn

1.9.1 · Windows

常用 Python 机器学习算法与模型评估工具库。

Black

Black

26.10.1 · Windows

强调一致性的 Python 自动代码格式化工具。

Ruff

Ruff

0.17.1 · macOS

由 Rust 编写的高速 Python 代码检查和格式化工具。

pytest

pytest

9.1.1 · Windows

简洁而强大的 Python 自动化测试框架。

FastAPI

FastAPI

0.146.0 · Windows

高性能 Python API 框架,支持类型提示和自动接口文档。

Flask

Flask

3.1.3 · Windows

轻量灵活的 Python Web 应用框架。

Django

Django

6.1.2 · Windows

成熟的 Python Web 框架,适合构建内容站点和业务系统。

Spyder

Spyder

6.1.7 · Windows

面向科学计算与数据分析的 Python 集成开发环境。

SciPy

SciPy

1.18.1 · Windows

面向科学、工程和技术计算的 Python 算法库。