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

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

表9.25.格式化函数

作用

描述

例子
到_char(时间戳,文本) →文本

到_char(带时区的时间戳,文本) →文本

根据给定格式将时间戳转换为字符串。

to_char(时间戳'2002-04-20 17:31:12.66','HH12:MI:SS')05:31:12
到_char(间隔,文本 ) → 文本

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

至_char(间隔'15h 2m 12s'、'HH24:MI:SS')15:02:12
到_char ( 数字型, 文本 ) → 文本

根据给定格式将数字转换为字符串;适用于整数, 比金, 数字的, 真实的, 双精度.

到_char(125,'999')125

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

至_char(-125.8,'999D99S')125.80-
迄今为止 ( 文本, 文本 ) → 日期

根据给定格式将字符串转换为日期。

截止日期('2000年12月5日,'DD Mon YYYY')2000-12-05
打电话给你 ( 文本, 文本 ) → 数字的

根据给定格式将字符串转换为数字。

to_编号('12454.8-','99G999D9S')-12454.8
到时间戳 ( 文本, 文本 ) → 带时区的时间戳

根据给定的格式将字符串转换为时间戳。(另见to_时间戳(双精度)在里面表9.32.)

至时间戳('2000年12月5日,'DD-Mon-YYYY')2000-12-05 00:00:00-05

# 提示

到时间戳迄今为止exist用于处理无法通过简单转换转换的输入格式。对于大多数标准的日期/时间格式,只需将源字符串转换为所需的数据类型就可以了,而且要容易得多。同样地,打电话给你对于标准的数字表示法来说是不必要的。

在一个到_char输出模板字符串时,会根据给定值识别某些模式,并用适当格式的数据替换这些模式。任何不是模板模式的文本都只是逐字复制。类似地,在输入模板字符串中(对于其他函数),模板模式标识输入数据字符串提供的值。如果模板字符串中有非模板模式的字符,则只需跳过输入数据字符串中的相应字符(无论它们是否等于模板字符串字符)。

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

表9.26.日期/时间格式的模板模式

图案 描述
一天中的小时数(01-12)
HH12 一天中的小时数(01-12)
HH24 一天中的小时数(00-23)
医疗保险 分钟(00-59)
党卫军 第二(00-59)
太太 毫秒(000–999)
我们 微秒(000000–99999)
FF1 十分之一秒(0-9)
FF2 百分之一秒(00-99)
FF3 毫秒(000–999)
FF4 十分之一毫秒(0000–9999)
FF5 百分之一毫秒(00000–99999)
FF6 微秒(000000–99999)
SSSS, SSSS 午夜过后几秒(0-86399)
, , 颗粒物下午 梅里迪姆指示器(无周期)
上午, 上午, 下午下午 梅里迪姆指数(带周期)
Y、 YYY 带逗号的年份(4位或更多数字)
YYYY 年份(4位或更多数字)
YYY 年度最后三位数
YY 年度最后两位数
Y 年度最后一位数
哎呀 ISO 8601周编号年份(4位或更多数字)
艾伊 ISO 8601周编号年份的最后3位数字
艾伊 ISO 8601周编号年份的最后两位数字
ISO 8601周编号年份的最后一位数字
公元前, 公元前, 公元公元 era指示器(无周期)
公元前, 公元前, 公元a、 d。 era指示器(带周期)
完整大写月份名称(空白填充至9个字符)
大写月份名称(空白填充至9个字符)
完整小写月份名称(空白填充至9个字符)
周一 缩写大写月份名称(英文为3个字符,本地化长度不同)
周一 缩写的大写月份名称(英文为3个字符,本地化长度不同)
周一 缩写小写月份名称(英文为3个字符,本地化长度不同)
月数(01-12)
白天 完整大写日名称(空白填充至9个字符)
白天 全大写日名(空白填充至9个字符)
白天 完整小写日期名称(空白填充至9个字符)
DY 缩写大写日名(英文为3个字符,本地化长度不同)
Dy 缩写的大写日名(英文为3个字符,本地化长度不同)
dy 缩写的小写日名(英文为3个字符,本地化长度不同)
DDD 一年中的某一天(001–366)
IDDD ISO 8601周编号年份的日期(001–371;一年的第一天是ISO第一周的星期一)
DD 月日(01-31)
D 星期天(1.)到周六(7.)
身份证件 ISO 8601一周中的一天,星期一(1.)到星期天(7.)
W 每月的一周(1-5)(第一周从每月的第一天开始)
栈单 一年中的周数(1–53)(第一周从一年中的第一天开始)
IW ISO 8601周编号年的周数(01–53;一年的第一个星期四在第1周)
科科斯群岛 世纪(两位数)(21世纪始于2001-01-01)
J 朱利安日期(自公元前4714年11月24日当地午夜起的整数天;参见B.7节)
Q 一刻钟
RM 大写罗马数字中的月份(I–XII;I=一月)
rm 小写罗马数字中的月份(i–xii;i=一月)
TZ 大写时区缩写(仅在中支持)到_char)
tz 小写时区缩写(仅在到_char)
TZH 时区小时数
TZM 时区分钟数
属于 与UTC的时区偏移(仅在到_char)

修改器可以应用于任何模板模式,以改变其行为。例如每月是吗图案与调频修饰语。表9.27显示日期/时间格式的修改器模式。

表9.27.用于日期/时间格式设置的模板模式修饰符

修饰语 描述 实例
调频前缀 填充模式(抑制前导零和填充空格) 每月
真实航向后缀 大写序数后缀 DDTH,例如。,第十二
th后缀 小写序数后缀 DDth,例如。,第十二
外汇前缀 固定格式全局选项(请参阅使用说明) 外汇月日
商标前缀 翻译模式(使用基于信用证_时间) TMMonth
服务提供商后缀 拼写模式(未实现) DDSP

日期/时间格式的使用说明:

  • 调频抑制前导零和尾随空格,否则会添加这些空格,以使图案的输出为固定宽度。在PostgreSQL中,调频在Oracle中,仅修改下一个规范调频影响所有后续规范,并重复调频修改器打开和关闭填充模式。

  • 商标是否抑制尾随空格调频是指定的。

  • 到时间戳迄今为止忽略输入中的字母大小写;比如说周一, 周一周一都接受相同的字符串。当使用商标修饰符,根据函数的输入排序规则进行大小写折叠(请参见第24.2节).

  • 到时间戳迄今为止跳过输入字符串开头以及日期和时间值周围的多个空格,除非外汇选项被使用。例如至时间戳(“2000年6月”、“YYYY-MON”)至时间戳('2000-JUN'、'YYYY-MON')工作,但是至时间戳('2000年6月','FXYYYY-MON')返回一个错误,因为到时间戳只需要一个空间。外汇必须指定为模板中的第一项。

  • 模板字符串中的分隔符(空格或非字母/非数字字符)到时间戳迄今为止匹配输入字符串中的任何单个分隔符或跳过,除非外汇选项被使用。例如时间戳('2000JUN','YYYY///MON')至时间戳('2000/JUN'、'YYYY-MON')工作,但是时间戳('2000//JUN'、'YYYY/MON')返回错误,因为输入字符串中的分隔符数量超过模板中的分隔符数量。

    如果外汇则模板字符串中的分隔符与输入字符串中的一个字符正好匹配。但请注意,输入字符串不要求与模板字符串的分隔符相同。例如至时间戳('2000/JUN'、'FXYYYY-MON')有效,但是至时间戳('2000/JUN'、'FXYYYY-MON')返回错误,因为模板字符串中的第二个空格占用了字母J从输入字符串。

  • A.TZH模板模式可以匹配有符号的数字。没有外汇选项中,减号可能不明确,并可能被解释为分隔符。这种模糊性的解决方法如下:如果TZH如果模板字符串中的分隔符数小于输入字符串中减号之前的分隔符数,则减号将被解释为TZH。否则,减号被视为值之间的分隔符。例如时间戳('2000-10','YYYY TZH')比赛-10TZH但是时间戳('2000-10','YYYY TZH')比赛10TZH.

  • 允许使用普通文本到_char模板和模板将被逐字输出。可以将子字符串放在双引号中,强制将其解释为文字文本,即使它包含模板模式。例如,在“你好年”YYYY这个YYYY将被年度数据取代,但Y在里面不会的。在里面迄今为止, 打电话给你到时间戳,文本和双引号字符串会导致跳过字符串中包含的字符数;例如“XX”跳过两个输入字符(无论它们是否为XX).

    # 提示

    在PostgreSQL 12之前,可以使用非字母或非数字字符跳过输入字符串中的任意文本。例如至时间戳('2000y6m1d','yyyy-MM-DD')以前工作过。现在,您只能使用字母字符进行此操作。例如至时间戳('2000y6m1d','yyyytMMtDDt')至时间戳('2000y6m1d'、'yyyy“y”MM“m”DD“d')跳过y, md.

  • 例如,如果想要在输出中使用双引号,则必须在其前面加反斜杠“\'yyy Month\'”.除双引号字符串外,反斜杠在其他方面并不特殊。在双引号字符串中,反斜杠会使下一个字符按字面意思表示,不管它是什么(但这没有特殊效果,除非下一个字符是双引号或另一个反斜杠)。

  • 在里面到时间戳迄今为止,如果年份格式规格小于四位数,例如。,YYY,且供应年份小于四位数,则该年份将调整为最接近2020年,例如。,95到1995年。

  • 在里面到时间戳迄今为止,负的年份被视为表示BC。如果你写了一个否定的年份和一个明确的年份公元前菲尔德,你又收到广告了。零年的输入被视为公元前1年。

  • 在里面到时间戳迄今为止这个YYYY当处理超过4位数的年份时,转换有限制。之后必须使用非数字字符或模板YYYY,否则年份总是被解释为4位数字。例如(20000年):截止日期('200001131','YYYYMMDD')将被解释为4位数的年份;而是在年后使用非数字分隔符,如截至日期('20000-1131','YYYY-MMDD')截止日期('20000Nov31'、'yyyymond').

  • 在里面到时间戳迄今为止这个科科斯群岛(世纪)字段被接受,但如果存在YYY, YYYYY、 YYY领域如果科科斯群岛与…连用YYY然后将结果计算为指定世纪的那一年。如果指定了世纪,但没有指定年份,则假定为世纪的第一年。

  • 在里面到时间戳迄今为止,工作日姓名或号码(白天, D,以及相关字段类型),但为计算结果而忽略。四分之一也是如此(Q)菲尔德。

  • 在里面到时间戳迄今为止,ISO 8601周编号日期(与公历日期不同)可以通过以下两种方式之一指定:

    • 年、周数和工作日:例如截至日期('2006-42-4'、'IYY-IW-ID')返回日期2006-10-19.如果省略工作日,则假定为1(星期一)。

    • 年份和日期:例如截至日期('2006-291'、'IYYY-IDDD')还返回2006-10-19.

      尝试使用ISO 8601周编号字段和公历日期字段的混合输入日期是毫无意义的,并且会导致错误。在ISO 8601周编号年份的背景下,“月”或“月中日”的概念没有任何意义。在公历年的背景下,ISO周没有任何意义。

    # 小心

    虽然迄今为止将拒绝混合使用公历和ISO周编号日期字段,到_char不会,因为输出格式规范如下YYYY-MM-DD(IYYY-IDDD)可能有用。但是不要写这样的东西年月日; 这将在今年年初产生令人惊讶的结果。(见第9.9.1节更多信息。)

  • 在里面到时间戳,毫秒(太太)或者微秒(我们)字段用作小数点后的秒数。例如to_时间戳('12.3','SS.MS')不是3毫秒,而是300毫秒,因为转换将其视为12+0.3秒。所以,对于格式党卫军。太太,输入值12.3, 12.3012.300指定相同的毫秒数。要获得三毫秒,必须写入12.003,转换将其视为12+0.003=12.003秒。

    下面是一个更复杂的例子:至_时间戳('15:12:02.020.001230','HH24:MI:SS.MS.US')是15小时12分2秒+20毫秒+1230微秒=2.021230秒。

  • to_char(…,'ID')的星期日编号与摘自功能,但是to_char(…,'D')的不匹配摘自情人节编号。

  • 到_char(间隔)格式HH12如12小时时钟所示,例如,0小时和36小时都输出为12虽然HH24输出整小时值,一小时内可超过23小时间隔价值

表9.28显示可用于格式化数值的模板模式。

表9.28.用于数字格式的模板模式

图案 描述
9 数字位置(如果不重要,可以删除)
0 数字位置(即使无关紧要,也不会被删除)
.(句号) 小数点
,(逗号) 组(千)分隔符
公共关系 尖括号中的负值
S 定位到数字的符号(使用区域设置)
L 货币符号(使用区域设置)
D 小数点(使用区域设置)
G 组分隔符(使用区域设置)
医疗保险 指定位置的减号(如果数字\<0)
PL 指定位置的加号(如果是数字> 0)
SG 指定位置的加号/减号
注册护士 罗马数字(输入介于1和3999之间)
真实航向th 序数后缀
五、 移位指定的位数(参见注释)
伊伊 科学符号指数

数字格式的使用说明:

  • 0指定始终打印的数字位置,即使它包含前导/尾随零。9还指定了一个数字位置,但如果它是前导零,则它将被一个空格替换,而如果它是尾随零,并且指定了填充模式,则它将被删除。(用于to_number(),这两个模式字符是等效的。)

  • 模式字符S, L, DG表示当前语言环境定义的符号、货币符号、小数点和数千个分隔符(请参见信用证_货币的信用证_数字的).句号和逗号表示这些精确的字符,其含义为小数点和千位分隔符,与语言环境无关。

  • 如果没有明确规定登录to_char()按照的模式,标志将保留一列,并锚定到(显示在)编号的左侧。如果S似乎只是一些9同样,它也将锚定在数字上。

  • 使用SG, PL医疗保险没有固定在数字上;例如至_char(-12,‘MI9999’)生产'- 12'但是至_char(-12,‘S9999’)生产'-12'.(Oracle 实现不允许使用心肌梗死9,而是要求9先于心肌梗死.)

  • TH不转换小于零的值,也不转换小数。

  • PL,SG, 和TH是 PostgreSQL 扩展。

  • to_number,如果非数据模板模式,如大号要么TH使用时,会跳过相应数量的输入字符,无论它们是否与模板模式匹配,除非它们是数据字符(即数字、符号、小数点或逗号)。例如,TH会跳过两个非数据字符。

  • to_char将输入值乘以10^*n*, 在哪里*n*是后面的位数.to_number以类似的方式划分。to_charto_number不支持使用结合小数点(例如,99.9V99不允许)。

  • 电子电气设备(科学记数法)不能与除数字和小数点模式之外的任何其他格式模式或修饰符组合使用,并且必须位于格式字符串的末尾(例如,9.99EEEE是一个有效的模式)。

    某些修饰符可以应用于任何模板模式以改变其行为。例如,FM99.99是个99.99图案与调频修饰语。表9.29显示数字格式的修改器模式。

表9.29.用于数字格式的模板模式修饰符

修饰语 描述 实例
调频前缀 填充模式(抑制尾随零和填充空格) FM99.99
真实航向后缀 大写序数后缀 9999
th后缀 小写序数后缀 第九百九十九

表9.30显示了使用到_char作用

表9.30.到_char例子

表示 后果
to_char(当前_时间戳'Day,DD HH12:MI:SS') “周二06:05:39:18”
to_char(当前_时间戳'FMDay,FMDD HH12:MI:SS') “周二,6 05:39:18”
到_char(-0.1,'99.99') ' -.10'
至_char(-0.1,'FM9.99') '-.1'
至_char(-0.1,'FM90.99') '-0.1'
到_char(0.1,'0.9') ' 0.1'
到_char(12,'9990999.9') ' 0012.0'
至_char(12,‘FM9990999.9’) '0012.'
至_char(485,'999') ' 485'
到_char(-485,'999') '-485'
到_char(485,'9') ' 4 8 5'
to_char(1485,'9999') ' 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'
到_char(-485,‘999S’) '485-'
到_char(-485,‘999MI’) '485-'
到_char(485,‘999MI’) '485'
至_char(485,‘FM999MI’) '485'
至_char(485,‘PL999’) '+485'
至_char(485,‘SG999’) '+485'
至_char(-485,‘SG999’) '-485'
至_char(-485,‘9SG99’) "4-85"
至_char(-485,‘999PR’) '<485>'
到_char(485,‘1999’) “DM 485”
to_char(485,‘RN’) “CDLxxv”
致_char(485,‘FMRN’) “CDLxxv”
to_char(5.2,“FMRN”) “V”
致_char(482,‘9999’) “482”
致_char(485),“好数字:999”) “好数字:485”
to_char(485.8,,“Pre:”999”Post:“.999”) '前:485后:.800'
到_char(12,'99V999') ' 12000'
到_char(12.4,'99V999') ' 12400'
到_char(12.45,'99V9') ' 125'
到_char(0.0004859,'9.99eee') “4.86e-04”