|
PostgreSQL
格式化函数提供一套有效的工具用于把各种数据类型
(日期/时间,integer,floating point,numeric)
转换成格式化的字符串以及反过来从格式化的字符串转换成
指定的数据类型。
这些函数都遵循一个公共的调用习惯:
第一个参数是待格式化的值,而第二个是一个定义输出格式的模板.
Table 4-11. 格式化函数
函数 |
返回 |
描述 |
例子 |
to_char
(
timestamp
,
text
) |
text
|
把 timestamp 转换成 string |
to_char(timestamp 'now','HH12:MI:SS')
|
to_char
(
int
,
text
) |
text
|
把 int4/int8 转换成 string |
to_char(125, '999')
|
to_char
(
double precision
,
text
) |
text
|
把 real/double precision 转换成 string |
to_char(125.8, '999D9')
|
to_char
(
numeric
,
text
) |
text
|
把 numeric 转换成 string |
to_char(numeric '-125.8', '999D99S')
|
to_date
(
text
,
text
) |
date
|
把 string 转换成 date |
to_date('05 Dec 2000', 'DD Mon YYYY')
|
to_timestamp
(
text
,
text
) |
date
|
把 string 转换成 timestamp |
to_timestamp('05 Dec 2000', 'DD Mon YYYY')
|
to_number
(
text
,
text
) |
numeric
|
把 string 转换成 numeric |
to_number('12,454.8-', '99G999D9S')
|
在输出模板字串里,该函数族可以识别一些特定的模式,并且
把待格式化的数值正确地格式化成相应的数据.
任何不属于模板模式的文本都简单地照字拷贝.同样,在一个输入
模板字串里,模板模式标识要查看的输入数据字串,并且将在该位置
寻找数值.
Table 4-12. 用于 date/time 转换的模板
模板 |
描述 |
HH
|
一天的小时数 (01-12) |
HH12
|
一天的小时数 (01-12) |
HH24
|
一天的小时数 (00-23) |
MI
|
分钟 (00-59) |
SS
|
秒 (00-59) |
MS
|
毫秒 (000-999) |
US
|
微秒 (000000-999999) |
SSSS
|
午夜后的秒 (0-86399) |
AM
或
A.M.
或
PM
或
P.M.
|
正午标识(大写) |
am
或
a.m.
或
pm
或
p.m.
|
正午标识(小写) |
Y,YYY
|
带逗号的年(4 和更多位) |
YYYY
|
年(4和更多位) |
YYY
|
年的后三位 |
YY
|
年的后两位 |
Y
|
年的最后一位 |
BC
或
B.C.
或
AD
或
A.D.
|
年标识(大写) |
bc
或
b.c.
或
ad
或
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) |
DD
|
一个月里的日子(01-31) |
D
|
一周里的日子(1-7;SUN=1) |
W
|
一个月里的周数(1-5),这里第一周从该月第一天开始 |
WW
|
一年里的周数(1-53),这里的第一周从该年的第一天开始 |
IW
|
ISO 一年里的周数(第一个星期四在第一周里) |
CC
|
世纪(2 位) |
J
|
Julian 日期(自公元前4712年1月1日来的日期) |
Q
|
季度 |
RM
|
罗马数字的月份(I-XII;I=JAN)-大写 |
rm
|
罗马数字的月份(I-XII;I=JAN)-小写 |
TZ
|
时区字串 - 大写 |
tz
|
时区字串 - 小写 |
有一些修饰词可以应用于模板来修改它们的行为.比如,
"
FMMonth
"
就是
带着
"
FM
"
前缀的
"
Month
"
模式.
Table 4-13. 日期/时间转换的模板模式修饰词
修饰词 |
描述 |
例子 |
FM
前缀 |
填充模式(抑制填充空白和零) |
FMMonth
|
TH
后缀 |
大写顺序数后缀 |
DDTH
|
th
后缀 |
增加小写顺序数后缀 |
DDth
|
FX
前缀 |
固定格式全局选项(见下面) |
FX Month DD Day
|
SP
suffix |
拼写模式(还未实现) |
DDSP
|
用法须知:
-
FM
抑制前导的零或尾随的空白,
如果没有使用它的话,会在输出中增加这些填充最终把
输出编程固定宽度的模式.
-
如果没有使用
FX
选项,
to_timestamp
和
to_date
在转换字串的时候忽略多个空白.
FX
必须做为模板里的第一个项声明。
比如
to_timestamp('2000 JUN','YYYY MON')
是正确的,
to_timestamp('2000 JUN','FXYYYY MON')
会返回一个错误,因为 to_timestamp() 只预料会有一个空白。
-
如果在字串常量里需要反斜杠(
"
\
"
),
那么你必须输入双反斜杠
(
"
\\
"
)
比如
'\\HH\\MI\\SS'
。对于
PostgreSQL
里的任何字串常量都是这样的.
-
在
to_char
模板
里可以有普通文本,但是任何在双引号之间的字串
都不会被解释为模板关键字并且它们处理得也更快些.
(例子:
'"Hello Year:
"YYYY'
)。
在
to_char
模板
里可以有普通文本,并且它们会被照字输出.
你可以把一个字串放到双引号里强迫它解释成一个文本,
即使它里面包含模式关键字也如此.比如,在
'"Hello Year: "YYYY'
,
YYYY
将被年份数据代替,但是单独
的
Y
不会.
-
如果你想在输出里有双引号,那么你必须在它们
前面放双反斜扛,比如
'\\"YYYY
Month\\"'
.
-
如果你使用的年份长于 4 位字符,那么用
YYYY
从字串向
timestamp
或者
date
做转换时要受到限制.
你必须在
YYYY
后面使用一些非数字字符或者模板,
否则年份总是解释为 4 位数字.比如(对于 20000 年):
to_date('200001131', 'YYYYMMDD')
将会被解释成一个 4 位数字的年份,
最好在年后面使用一个非数字的分隔符,象
to_date('20000-1131', 'YYYY-MMDD')
或
to_date('20000Nov31', 'YYYYMonDD')
.
-
将字串转化为时间戳时,
毫秒
MS
和微秒
US
都是用字串
的小数点后面的部分转换的.比如
to_timestamp('12:3', 'SS:MS')
不是 3 毫秒,
而是 300,因为转换把它看做 12 + 0.3.
这意味着对于格式 'SS:MS'而言,输入值为
12:3
或
12:30
或
12:300
声明了相同数目的
毫秒.对于三毫秒,你必须使用
12:003
,那么转换会把它看做
12 + 0.003 = 12.003 秒.
下面是一个更复杂的
例子∶
to_timestamp('15:12:02.020.001230','HH:MI:SS.MS.US')
是 15 小时,12 分钟,和 2 秒 + 20 毫秒 + 1230微秒 = 2.021230 秒.
Table 4-14. 用于向 numeric 转换的模板模式
模板 |
描述 |
9
|
带有指定数值位数的值 |
0
|
带前导零的值 |
.
(句点) |
小数点 |
,
(逗号) |
分组(千)分隔符 |
PR
|
尖括号内负值 |
S
|
带负号的负值(使用区域设置) |
L
|
货币符号(使用区域设置) |
D
|
小数点(使用区域设置) |
G
|
分组分隔符(使用区域设置) |
MI
|
在指明的位置的负号(如果数字 < 0) |
PL
|
在指明的位置的正号(如果数字 > 0) |
SG
|
在指明的位置的正/负号 |
RN
|
罗马数字(输入在 1 和 3999 之间) |
TH
或
th
|
转换成序数 |
V
|
移动
n
位(小数)(参阅注解)
|
EEEE
|
科学记数。(现在还未实现) |
用法须知:
-
使用
SG
,
PL
或
MI
生成的符号并不挂在数字上面;
比如,
to_char(-12, 'S9999')
生成
' -12'
,
而
to_char(-12, 'MI9999')
生成
'- 12'
。
Oracle 里的实现不允许在
9
前面使用
MI
,而是要求
9
在
MI
前面。
-
9
表示和
9
的个数
相同的数字位数的数值.如果某个数值位没有数字,则用空白代替.
-
TH
不会转换小于零的数值,也不会转换小数.
-
PL
,
SG
和
TH
是
PostgreSQL
扩展。
-
V
方便地把输入值乘以
10^
n
,这里
n
是跟在
V
后面的数字。
to_char
不支持把
V
与一个小数点组合在一起使用
(也就是说,
99.9V99
是不允许的)。
Table 4-15.
to_char
例子
输入 |
输出 |
to_char(now(),'Day, DD HH12:MI:SS')
|
'Tuesday , 06 05:39:18'
|
to_char(now(),'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(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,'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,'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'
|
|