Redrock Postgres 搜索 英文
版本: 9.3 / 9.4 / 9.5 / 9.6 / 10 / 11 / 12 / 13 / 14 / 15 / 16 / 17 / 18

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

PostgreSQL 的格式化函数提供了一套强大的工具,用于将各种数据类型(日期/时间、整数、浮点数、数值)转换为格式化的字符串,以及从格式化的字符串转换为特定的数据类型。 表 9.26 列出了这些函数。所有这些函数都遵循一个通用的调用约定:第一个参数是要格式化的值,第二个参数是定义输出或输入格式的模板。

表 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

根据给定的格式将间隔转换为字符串。

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

根据给定的格式将字符串转换为时间戳。(另请参见 表 9.33 中的 to_timestamp(double precision)。)

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


提示

to_timestampto_date 函数用于处理无法通过简单类型转换的输入格式。对于大多数标准的日期/时间格式,只需将源字符串强制转换为所需的数据类型即可,这样更简单。同样,对于标准数值表示,to_number 函数是不必要的。

to_char 的输出模板字符串中,某些模式会被识别并根据给定值进行相应格式化替换。任何非模板模式的文本都会被原样复制。同样,在输入模板字符串(用于其他函数)中,模板模式标识输入数据字符串要提供的值。如果模板字符串中包含非模板模式的字符,则输入数据字符串中的相应字符将被跳过(无论它们是否与模板字符串中的字符相等)。

表 9.27 显示了用于格式化日期和时间值的模板模式。

表 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, PMpm 上午/下午指示器(无句点)
A.M., a.m., P.M.p.m. 上午/下午指示器(有句点)
Y,YYY 年份(4 位或更多数字),带逗号
YYYY 年份(4 位或更多数字)
YYY 年份的后 3 位数字
YY 年份的后 2 位数字
Y 年份的最后 1 位数字
IYYY ISO 8601 编号年份(4 位或更多数字)
IYY ISO 8601 编号年份的后 3 位数字
IY ISO 8601 编号年份的后 2 位数字
I ISO 8601 编号年份的最后 1 位数字
BC, bc, ADad 纪元指示器(无句点)
B.C., b.c., A.D.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 天是第一周的星期一)
DD 月份中的第几天 (01–31)
D 星期中的第几天,星期日 (1) 到星期六 (7)
ID ISO 8601 星期中的第几天,星期一 (1) 到星期日 (7)
W 月份中的第几周 (1–5)(第一周从月份的第一天开始)
WW 一年中的第几周 (1–53)(第一周从一年中的第一天开始)
IW ISO 8601 编号年份中的第几周 (01–53;一年中的第一个星期四在第 1 周)
CC 世纪(2 位数字)(二十一世纪始于 2001-01-01)
J 儒略日(从公元前 4714 年 11 月 24 日当地午夜开始的整数天数;参见 B.7 节
Q 季度
RM 大写罗马数字月份 (I–XII;I=一月)
rm 小写罗马数字月份 (i–xii;i=一月)
TZ 大写时区缩写
tz 小写时区缩写
TZH 时区小时
TZM 时区分钟
OF 与 UTC 的时区偏移(HHHH:MM

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

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

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

日期/时间格式化用法说明

表 9.29 显示了用于格式化数值的模板模式。

表 9.29. 数值格式化模板模式

模式 描述
9 数字位置(如果无符号则可省略)
0 数字位置(即使无符号也保留)
. (句点) 小数点
, (逗号) 分组(千位)分隔符
PR 用尖括号表示的负值
S 符号固定在数字上(使用区域设置)
L 货币符号(使用区域设置)
D 小数点(使用区域设置)
G 分组分隔符(使用区域设置)
MI 在指定位置的负号(如果数字 < 0)
PL 在指定位置的正号(如果数字 > 0)
SG 在指定位置的正负号
RNrn 罗马数字(1 到 3999 之间的值)
THth 序数后缀
V 移动指定位数的数字(参见说明)
EEEE 科学计数法的指数

数值格式化用法说明

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

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

修饰符 描述 示例:
FM 前缀 填充模式(抑制尾随零和填充空格) FM99.99
TH 后缀 大写序数后缀 999TH
th 后缀 小写序数后缀 999th

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

表 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', ISO8601 扩展格式
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'