PostgreSQL 中文参考文档
🌐 英文原版 官方 ↗

9.8. 数据类型格式化函数 #

PostgreSQL 的格式化函数提供了一套极其强大的数据转换工具,用于在各种内置数据类型(日期时间、整数、浮点数、高精度数值)与格式化字符串之间进行双向解析与转换。 Table 9.26 列出了这些函数。 这些函数都遵循一个通用的调用约定:第一个参数是要被格式化的值, 第二个参数是一个定义输出或输入格式的模板。

Table 9.26. 格式化函数

函数

说明

示例

to_char ( timestamp, text ) → text

to_char ( timestamp with time zone, text ) → text

按照给定的格式把时间戳转换为字符串。

to_char(timestamp '2002-04-20 17:31:12.66', 'HH12:MI:SS') → 05:31:12

to_char ( interval, text ) → text

按照给定的格式把 interval 转换为字符串。

to_char(interval '15h 2m 12s', 'HH24:MI:SS') → 15:02:12

to_char ( numeric_type, text ) → text

按照给定的格式把数字转换为字符串; 可用于 integer、 bigint、 numeric、 real、 double precision。

to_char(125, '999') → 125

to_char(125.8::real, '999D9') → 125.8

to_char(-125.8, '999D99S') → 125.80-

to_date ( text, text ) → date

按照给定的格式把字符串转换为日期。

to_date('05 Dec 2000', 'DD Mon YYYY') → 2000-12-05

to_number ( text, text ) → numeric

按照给定的格式把字符串转换为数字。

to_number('12,454.8-', '99G999D9S') → -12454.8

to_timestamp ( text, text ) → timestamp with time zone

按照给定的格式把字符串转换为时间戳。 (另请参见 Table 9.33 中的 to_timestamp(double precision)。)

to_timestamp('05 Dec 2000', 'DD Mon YYYY') → 2000-12-05 00:00:00-05


Tip

to_timestamp 和 to_date 的存在是为了处理简单转换无法处理的输入格式。 对于大多数标准的日期/时间格式, 只要把源字符串转换为所需的数据类型就可以了, 而且容易得多。 类似地, 对于标准的数字表示, 也用不着 to_number。

在一个 to_char 输出模板字符串中, 某些模式会被识别, 并根据给定的值被替换为相应格式的数据。 任何不是模板模式的文本都会被原样复制。 类似地, 在一个输入模板字符串中 (针对其他函数), 模板模式标识要由输入数据字符串提供的值。 如果模板字符串中存在不是模板模式的字符, 那么输入数据字符串中对应的字符会被简单地跳过 (无论它们是否等于模板字符串中的字符)。

Table 9.27 展示了可用于日期和时间值格式化的模板模式。

Table 9.27. 日期/时间格式化的模板模式

模式说明
HH 一天中的小时(01–12)
HH12 一天中的小时(01–12)
HH24 一天中的小时(00–23)
MI 分钟(00–59)
SS 秒(00–59)
MS 毫秒(000–999)
US 微秒(000000–999999)
FF1 秒的十分之一(0–9)
FF2 秒的百分之一(00–99)
FF3 毫秒(000–999)
FF4 毫秒的十分之一(0000–9999)
FF5 毫秒的百分之一(00000–99999)
FF6 微秒(000000–999999)
SSSS, SSSSS 午夜以来的秒数(0–86399)
AM, am, PM or pm上下午指示符(不带句点)
A.M., a.m., P.M. or p.m.上下午指示符(带句点)
Y,YYY年(4 位或更多数字)带逗号
YYYY年(4 位或更多数字)
YYY年份的最后 3 位
YY年份的最后 2 位
Y年份的最后 1 位
IYYYISO 8601 周编号年(4 位或更多数字)
IYYISO 8601 周编号年的最后 3 位
IYISO 8601 周编号年的最后 2 位
IISO 8601 周编号年的最后 1 位
BC, bc, AD or ad纪元指示符(不带句点)
B.C., b.c., A.D. or a.d.纪元指示符(带句点)
MONTH全大写的月份名(用空格填充到 9 个字符)
Month首字母大写的完整月份名(用空格填充到 9 个字符)
month全小写的月份名(用空格填充到 9 个字符)
MON缩写的全大写月份名(英语中为 3 个字符,本地化后长度不定)
Mon缩写的首字母大写月份名(英语中为 3 个字符,本地化后长度不定)
mon缩写的全小写月份名(英语中为 3 个字符,本地化后长度不定)
MM 月份数字(01–12)
DAY全大写的星期几名(用空格填充到 9 个字符)
Day首字母大写的完整星期几名(用空格填充到 9 个字符)
day全小写的星期几名(用空格填充到 9 个字符)
DY缩写的全大写星期几名(英语中为 3 个字符,本地化后长度不定)
Dy缩写的首字母大写星期几名(英语中为 3 个字符,本地化后长度不定)
dy缩写的全小写星期几名(英语中为 3 个字符,本地化后长度不定)
DDD 一年中的第几天(001–366)
IDDD ISO 8601 周编号年中的天(001–371;一年的第 1 天是第一个 ISO 周的星期一)
DD 一月中的第几天(01–31)
D星期几,从星期日(1)到星期六(7)
IDISO 8601 星期几,从星期一(1)到星期日(7)
W 月内的周(1–5)(第一周从该月的第一天开始)
WW 年内的周编号(1–53)(第一周从一年的第一天开始)
IW ISO 8601 周编号年的周编号(01–53;一年的第一个星期四在第 1 周)
CC世纪(2 位数字)(二十一世纪始于 2001-01-01)
J 儒略日(自当地午夜的公元前 4714 年 11 月 24 日以来的整数天数;参见 Section B.7)
Q 季度
RM 大写罗马数字的月份(I–XII;I=一月)
rm 小写罗马数字的月份(i–xii;i=一月)
TZ大写的时区缩写
tz小写的时区缩写
TZH 时区小时
TZM 时区分钟
OF 相对于 UTC 的时区偏移(HH 或 HH:MM)

修饰符可以应用于任何模板模式以改变其行为。 例如, FMMonth 就是带有 FM 修饰符的 Month 模式。 Table 9.28 展示了日期/时间格式化的修饰符模式。

Table 9.28. 日期/时间格式化的模板模式修饰符

修饰符 说明示例
FM 前缀 填充模式(抑制前导零和填充空白)FMMonth
TH 后缀 大写的序数后缀DDTH, e.g., 12TH
th 后缀 小写的序数后缀DDth, e.g., 12th
FX 前缀 固定格式全局选项(参见使用注意事项)FX Month DD Day
TM 前缀 翻译模式(基于 lc_time 使用本地化的星期和月份名称) TMMonth
SP 后缀 拼写模式(未实现)DDSP

日期/时间格式化的使用注意事项:

Table 9.29 展示了可用于数字值格式化的模板模式。

Table 9.29. 数值格式化的模板模式

模式说明
9数字位置(如果不重要则可以去掉)
0数字位置(不会被去掉,即使它不重要)
. (period) 小数点
, (comma) 分组(千位)分隔符
PR尖括号中的负值
S锚定到数字的正负号(使用区域设置)
L货币符号(使用区域设置)
D小数点(使用区域设置)
G分组分隔符(使用区域设置)
MI指定位置上的负号(如果数字小于 0)
PL指定位置上的加号(如果数字大于 0)
SG指定位置上的加/减号
RN or rn罗马数字(介于 1 与 3999 之间的值)
TH or th 序数后缀
V移动指定数量的数位(参见注意事项)
EEEE科学计数法的指数

数字格式化的使用注意事项:

某些修饰符可以应用于任何模板模式以改变其行为。 例如, FM99.99 就是带有 FM 修饰符的 99.99 模式。 Table 9.30 展示了数字格式化的修饰符模式。

Table 9.30. 数值格式化的模板模式修饰符

修饰符 说明示例
FM 前缀 填充模式(抑制尾部零和填充空白)FM99.99
TH 后缀 大写的序数后缀999TH
th 后缀 小写的序数后缀999th

Table 9.31 展示了 to_char 函数使用的一些例子。

Table 9.31. to_char 示例

表达式 结果
to_char(current_timestamp, 'Day, DD  HH12:MI:SS')'Tuesday  , 06  05:39:18'
to_char(current_timestamp, 'FMDay, FMDD  HH12:MI:SS')'Tuesday, 6  05:39:18'
to_char(current_timestamp AT TIME ZONE 'UTC', 'YYYY-MM-DD"T"HH24:MI:SS"Z"') '2022-12-06T05:39:18Z',ISO 8601 扩展格式
to_char(-0.1, '99.99')'  -.10'
to_char(-0.1, 'FM9.99')'-.1'
to_char(-0.1, 'FM90.99')'-0.1'
to_char(0.1, '0.9')' 0.1'
to_char(12, '9990999.9')'    0012.0'
to_char(12, 'FM9990999.9')'0012.'
to_char(485, '999')' 485'
to_char(-485, '999')'-485'
to_char(485, '9 9 9')' 4 8 5'
to_char(1485, '9,999')' 1,485'
to_char(1485, '9G999')' 1 485'
to_char(148.5, '999.999')' 148.500'
to_char(148.5, 'FM999.999')'148.5'
to_char(148.5, 'FM999.990')'148.500'
to_char(148.5, '999D999')' 148,500'
to_char(3148.5, '9G999D999')' 3 148,500'
to_char(-485, '999S')'485-'
to_char(-485, '999MI')'485-'
to_char(485, '999MI')'485 '
to_char(485, 'FM999MI')'485'
to_char(485, 'PL999')'+485'
to_char(485, 'SG999')'+485'
to_char(-485, 'SG999')'-485'
to_char(-485, '9SG99')'4-85'
to_char(-485, '999PR')'<485>'
to_char(485, 'L999')'DM 485'
to_char(485, 'RN')'        CDLXXXV'
to_char(485, 'FMRN')'CDLXXXV'
to_char(5.2, 'FMRN')'V'
to_char(482, '999th')' 482nd'
to_char(485, '"Good number:"999')'Good number: 485'
to_char(485.8, '"Pre:"999" Post:" .999')'Pre: 485 Post: .800'
to_char(12, '99V999')' 12000'
to_char(12.4, '99V999')' 12400'
to_char(12.45, '99V9')' 125'
to_char(0.0004859, '9.99EEEE')' 4.86e-04'