为将不同数据类型(包括日期/时间,整数,浮点数,数值)转换成格式化后的字符和将格式化后的字符串转换为特定的数据类型,PolarDB的格式化函数提供了很多功能强大的工具。

下面列出了这些格式化函数都遵循通用的调用约定:第一个参数是需要格式化的值;第二个参数是字符串模板,用于定义输出或输入的格式。

表 1. 格式化函数
函数 返回类型 说明 示例 结果
TO_CHAR(DATE [, format ]) VARCHAR2 将日期/时间转换为 format 指定格式的字符串输出。如果省略,则默认格式为 DD-MON-YY TO_CHAR(SYSDATE, 'MM/DD/YYYY HH12:MI:SS AM') 07/25/2007 09:43:02 AM
TO_CHAR(INTEGER [, format ]) VARCHAR2 将整数转换为 format 指定格式的字符串输出 TO_CHAR(2412, '999,999S') 2,412+
TO_CHAR(NUMBER [, format ]) VARCHAR2 将十进制数转换为 format 指定格式的字符串输出 TO_CHAR(10125.35, '999,999.99') 10,125.35
TO_CHAR(DOUBLE PRECISION, format) VARCHAR2 将浮点数转换为 format 指定格式的字符串输出 TO_CHAR(CAST(123.5282 AS REAL), '999.99') 123.53
TO_DATE(string [, format ]) DATE 将日期格式化字符串转换为 DATE 数据类型 TO_DATE('2007-07-04 13:39:10', 'YYYY-MM-DD HH24:MI:SS') 04-JUL-07 13:39:10
TO_NUMBER(string [, format ]) NUMBER 将数字格式化字符串转换为 NUMBER 数据类型 TO_NUMBER('2,412-', '999,999S') -2412
TO_TIMESTAMP(string, format) TIMESTAMP 将时间戳格式化字符串转换为 TIMESTAMP 数据类型 TO_TIMESTAMP('05 Dec 2000 08:30:25 pm', 'DD Mon YYYY hh12:mi:ss pm') 05-DEC-00 20:30:25

在TO_CHAR函数的输出模板字符串中,这里有固定的模式可以识别,并且由格式化的数值所替代,而任何不是标准模式的文字是简单的逐字拷贝。类似的情况,在一个输入模板字符串中(对除了TO_CHAR以外的其他函数),模板模式能够标识出输入字符串的部分和要寻找的值。

下面的表显示了在函数TO_CHAR和TO_DATE中可以用来格式化数值的模板模式。

表 2. 模板日期/时间格式模式
模式 说明
HH 一天中的小时 (01-12)
HH12 一天中的小时 (01-12)
HH24 一天中的小时 (00-23)
MI 分钟 (00-59)
SS 秒 (00-59)
SSSSS 午夜过后的秒 (0-86399)
AM 或 A.M. 或者 PM 或 P.M. 午时指示符(大写)
am 或 a.m. 或者 pm 或 p.m. 午时指示符(小写)
Y,YYY 带逗号的年份(4 位及更多位数)
YEAR 年份(完整拼写)
SYEAR 年份(完整拼写)(前面附加了减号的 BC 日期)
YYYY 年份(4 位及更多位数)
SYYYY 年份(4 位及更多位数)(前面附加了减号的 BC 日期)
YYY 年份的后三位数
YY 年份的后两位数
Y 年份的后一位数
IYYY ISO 年(4 位及更多位数)
IYY ISO 年份的后三位数
IY ISO 年份的后两位数
I ISO 年份的后一位数
BC 或 B.C. 或者 AD 或 A.D. 纪元指示符(大写)
bc 或 b.c. 或者 ad 或 a.d. 纪元指示符(小写)
MONTH 完整的大写月份名称
Month 完整的混合大小写月份名称
month 完整的小写月份名称
MON 缩写的大写月份名称(英文为 3 个字符,本地化后长度不同)
Mon 缩写的混合大小写月份名称(英文为 3 个字符,本地化后长度不同)
mon 缩写的小写月份名称(英文为 3 个字符,本地化后长度不同)
MM 月份编号 (01-12)
DAY 完整的大写日名称
Day 完整的混合大小写日名称
day 完整的小写日名称
DY 缩写的大写日名称(英文为 3 个字符,本地化后长度不同)
Dy 缩写的混合大小写日名称(英文为 3 个字符,本地化后长度不同)
dy 缩写的小写日名称(英文为 3 个字符,本地化后长度不同)
DDD 年中日期(001-366)
DD 每月几号 (01-31)
D 星期几(1-7;星期日为 1)
W 每月第几周(1-5)(第一周从月的第一天开始)
WW 一年中的周编号 (1-53)(第一周从一年的第一天开始)
IW 一年中的 ISO 周编号;新年的第一个星期四在第 1 周中
CC 世纪(两位数);21 世纪从 2001-01-01 开始
SCC 与 CC 相同,但 BC 日期以减号为前缀
J 朱利安日(自公元前 4712 年 1 月 1 日起)
Q 季度
RM 用罗马数字表示的月份(I-XII;I= 1 月)(大写)
rm 用罗马数字表示的月份(i-xii;i= 1 月)(小写)
RR 年份的前两位数(在仅给定年份的后两位数时)。结果基于使用当前年份和给定的两位数年份的算法。给定的两位数年份的前两位数将与当前年份的前两位数相同,但以下情况除外:
  • 如果给定的两位数年份 < 50 且当前年份的最后两位数 >= 50,则给定年份的前两位数比当前年份的前两位数大 1。
  • 如果给定的两位数年份 >= 50 且当前年份的最后两位数 < 50,则给定年份的前两位数比当前年份的前两位数小 1。
RRRR 仅影响 TO_DATE 函数。允许两位数或四位数年份规范。如果给定两位数年份,则返回年份的前两位数字,如 RR 格式。如果给定 4 位数年份,则返回给定的 4 位数年份。
某些修改者可以应用到任何模板模式,以用来修改它的行为。例如,FMMonth是带有FM修改者的Month模式。下面的表显示了针对日期/时间格式的模式修改者。
表 3. 日期/时间格式的模板模式修饰符
修饰符 说明 示例
FM 前缀 填充模式(禁止填充空格和零) FMMonth
TH 后缀 大写序号后缀 DDTH
th 后缀 小写序号后缀 DDth
FX 前缀 固定格式全局选项(参见使用说明) FX Month DD Day
SP 后缀 拼写模式 DDSP
说明
  • FM压缩前面的0和尾部的空格,这些0和空格用于使输出符合固定宽度的模式。
  • 如果没有使用FX选项,TO_TIMESTAMP和TO_DATE跳过输入字符串中的多个空格。必须将Fx指定为模板中第一个成员。例如TO_TIMESTAMP('2000 JUN', 'YYYY MON')这种方式是正确的,但是TO_TIMESTAMP('2000 JUN', 'FXYYYY MON')会返回错误,因为TO_TIMESTAMP只是期望一个空格。
  • 在TO_CHAR函数中允许使用普通文本,并且函数的输出也是以文本方式实现的。
  • 在把字符串从类型timestamp 转换到date的过程中,如果这里有YYY,YYYY,或者是Y,YYY字段,那么CC字段可以忽略。如果使用了带有YY或者Y字段的CC值,那么年的计算方式就是(CC-1)*100+YY
下面的表格显示了格式化数值时可以使用的模板模式。
表 4. 用于数字格式化的模板模式
模式 说明
9 具有指定位数的值
0 带前导零的值
.(句点) 小数点
,(逗号) 组(千位)分隔符
$ 美元符号
PR 尖括号中的负值
S 锚定到数字的符号(使用区域设置)
L 货币符号(使用区域设置)
D 小数点(使用区域设置)
G 组分隔符(使用区域设置)
MI 在最右侧位置指定的减号(如果数字 < 0)
RN 或 rn 罗马数字(1 到 3999 之间的输入)
V 移位指定的位数(参阅注释)
说明
  • 数字9产生的值和9s的一样,如果没有指定数字的话,那么输出空格。
  • TH不转换小于0的值,并且不转换小数值。

V有效地用10n和输入值相乘,其中n是V.TO_CHAR后面数字的数量。在这里不支持使用V和小数点组合(例如,不允许使用99.9V99这种形式)。

下面的表显示了一些使用TO_CHAR和TO_DATE函数的示例。
表达式 结果
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(-0.1, '99.99') ' -.10'
TO_CHAR(-0.1, 'FM9.99') '-.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(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(4 85, 'FM999MI') '485'
TO_CHAR(-485, '999PR') '<485>'
TO_CHAR(485, 'L999') '$ 485'
TO_CHAR(4 85, 'RN') ' CDLXXXV'
TO_CHAR(4 85, 'FMRN') 'CDLXXXV'
TO_CHAR(5.2, 'FMRN') 'V'
TO_CHAR(12, '99V999') ' 12000'
TO_CHAR(12.4, '99V999') ' 12400'
TO_CHAR(12.45, '99V9') ' 125'