postgres格式化时间_PostgreSQL数据类型格式化函数PostgreSQL 格式化函数提供⼀套有效的⼯具⽤于把各种数据类型转换成格式化的字符串以及反过来从格式化的字符串转换成指定的数据类型。表9-20列出了这些函数。这些函数都遵循⼀个公共的调⽤习惯:第⼀个参数是待格式化的值,⽽第⼆个是定义输出或输出格式的模板。
to_timestamp 函数也能接受⼀个 double precision 参数,把它从 Unix 纪元转换成 timestamp with time zone。Integer 类型的 Unix 纪元隐含地转换成了 double precision 。
表9-20. 格式化函数
函数返回类型描述例⼦
to_char(timestamp, text)text把时间戳转换成字符串to_char(current_timestamp, 'HH12:MI:SS')
to_char(interval, text)text把时间间隔转为字符串to_char(interval '15h 2m 12s', 'HH24:MI:SS')
to_char(int, text)text把整数转换成字符串to_char(125, '999')
to_char(double precision, text)text把实数/双精度数转换成字符串to_char(125.8::real, '999D9')
to_char(numeric, text)text把数字转换成字符串to_char(-125.8, '999D99S')
to_date(text, text)date把字符串转换成⽇期to_date('05 Dec 2000', 'DD Mon YYYY')
to_number(text, text)numeric把字符串转换成数字to_number('12,454.8-', '99G999D9S')
to_timestamp(text, text)timestamp with time zone把字符串转换成时间戳to_timestamp('05 Dec 2000', 'DD Mon YYYY')
to_timestamp(double precision)timestamp with time zone把 UNIX 纪元转换成时间戳to_timestamp(200120400)
在输出模板字符串⾥(对 to_char ⽽⾔),该函数族可以识别⼀些特定的模式,并且把待格式化的数值正确地格式化成相应的数据。任何不属于模板模式的⽂本都简单地逐字拷贝。同样,在⼀个输⼊模板字符串⾥(对除 to_char 外的任何东西),模板模式标识要查看的输⼊数据字符串,并且将在该位置寻数值。
表9-21显⽰了可以⽤于格式化⽇期和时间值的模版。
表9-21. ⽤于⽇期/时间格式化的模式
模式描述
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年的最后⼀位
IYYYISO年(4 位或更多位)
IYYISO年的最后三位
IYISO年的最后两位
IISO年的最后⼀位
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)
unix时间戳转换日期格式D⼀周⾥的⽇(1-7 ;周⽇是 1)
W⼀个⽉⾥的周数(1-5)(第⼀周从该⽉第⼀天开始) WW⼀年⾥的周数(1-53)(第⼀周从该年的第⼀天开始) IWISO⼀年⾥的周数(第⼀个星期四在第⼀周⾥)
CC世纪(2 位)(20 世纪从 2001-01-01 开始)
J儒略⽇(⾃公元前 4712 年 1 ⽉ 1 ⽇来的天数)
Q季度
RM罗马数字的⽉份(I-XII ;I=JAN)(⼤写)
rm罗马数字的⽉份(I-XII ;I=JAN)(⼩写)
TZ时区名(⼤写)
tz时区名(⼩写)
有⼀些修饰词可以应⽤于模板来修改它们的⾏为。⽐如,FMMonth 就是带着 FM 前缀的 Month 模式。表9-22显⽰了⽤于⽇期/时间格式化的修饰词模式。
表9-22. ⽇期/时间格式化的模板模式修饰词
修饰符描述例⼦
FM 前缀填充模式(抑制填充空⽩和零)FMMonth
TH 后缀⼤写顺序数后缀DDTH
th 后缀⼩写顺序数后缀DDth
FX 前缀固定格式全局选项(见⽤法须知)FX Month DD Day
TM 前缀翻译模式(基于 lc_messages 显⽰本地化的⽇期和⽉份名)TMMonth
SP 后缀拼写模式(还未实现)DDSP
⽇期/时间格式化的⽤法须知:
FM 抑制前导的零或尾随的空⽩,如果没有使⽤它的话,会在输出中增加这些填充最终把输出变成固定宽度的模式。
TM 不包含结尾空⽩。
如果没有使⽤ FX ,to_timestamp 和 to_date 在转换字符串的时候忽略多个空⽩。FX 必须做为模板⾥的第⼀个项声明。⽐如
to_timestamp('2000    JUN', 'YYYY MON') 是正确的,但是 to_timestamp('2000    JUN', 'FXYYYY MON') 会返回⼀个错误,因为
to_timestamp 只预料会有⼀个空⽩。
在 to_char 模板⾥可以有普通⽂本,并且它们会被逐字输出。你可以把⼀个字符串放到双引号⾥强迫它解释成⼀个⽂本,即使它⾥⾯包含模式关键字也如此。⽐如,'"Hello Year "YYYY' 中的 YYYY 将被年份数据代替,但是 Year ⾥单独的 Y 不会。
如果你想在输出⾥有双引号,那么你必须在它们前⾯放双反斜杠,⽐如 E'\\"YYYY Month\\"' (需要两个反斜杠是因为反斜杠在字符串常量⾥已经有特殊含义了)。
如果你使⽤的年份长于4位字符,那么⽤ YYYY 从字符串向 timestamp 或 date 做转换时要受到限制。你必须在 YYYY 后⾯使⽤⼀些⾮数字字符或者模板,否则年份总是解释为 4 位数字。⽐如对于 20000 年:to_date('200001131', 'YYYYMMDD') 将会被解释成⼀个 4 位数字的年份,最好在年后⾯使⽤⼀个⾮数字的分隔符,像 to_date('20000-1131', 'YYYY-MMDD') 或 to_date('20000Nov31',
'YYYYMonDD') 。
在从字符串向 timestamp 或 date 转换的时候,如果有 YYY, YYYY 或 Y,YYY 字段,那么 CC 字段会被忽略。如果 CC 与 YY 或 Y ⼀起使⽤,那么年份⽤公式 (CC-1)*100+YY 计算。
将字符串转化为 timestamp 时,毫秒(MS)和微秒(US)都是⽤字符串的⼩数点后⾯的部分转换的。⽐如 to_timestamp('12:3', 'SS:MS')不是 3 毫秒, ⽽是 300 毫秒,因为转换把它看做 12+0.3 秒。这意味着对于格式 SS:MS ⽽⾔,输⼊值 12:3, 12:30, 12:300 声明了相同的毫秒数。对于 3 毫秒,你必须使⽤ 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秒。
to_char 的星期编号(参阅'D'格式化模式)与 extract 的不同。
to_char(interval) 将 HH 和 HH12 格式化为⼀⽇之内的⼩时数,⽽ HH24 可以输出超出⼀⽇的⼩时数,⽐如 >24 。
表9-23 shows the template patterns available for formatting numeric values
表9-23. 显⽰了可以⽤于数值格式化的模版模式。
模式描述
9带有指定数值位数的值
0带前导零的值
. (句点)⼩数点
, (逗号)分组(千)分隔符
PR尖括号内负值
S带符号的数值(使⽤区域设置)
L货币符号(使⽤区域设置)
D⼩数点(使⽤区域设置)
G分组分隔符(使⽤区域设置)
MI在指明的位置的负号(如果数字 < 0)
PL在指明的位置的正号(如果数字 > 0)
SG在指明的位置的正/负号
RN罗马数字(输⼊在 1 和 3999 之间)
TH 或 th序数后缀
V移动指定位(⼩数)(参阅注解)
EEEE科学记数(尚未实现)
数字格式化的⽤法须知:
使⽤ SG, PL, MI ⽣成的符号并不挂在数字上⾯;⽐如,to_char(-12, 'S9999') ⽣成 '  -12' ;to_char(-1
2, 'MI9999') ⽣成 '-  12' 。Oracle⾥的实现不允许在 9 前⾯使⽤ MI ,⽽是要求 9 在 MI 前⾯。
9 声明和 9 的个数相同的数字位数的数值。如果某个数值位没有数字,则输出⼀个空⽩。
TH 不会转换⼩于零的数值,也不会转换⼩数。
PL, SG, TH 是 PostgreSQL 扩展。
V ⽅便地把输⼊值乘以 10^n ,这⾥ n 是跟在 V 后⾯的数字。to_char 不⽀持把 V 与⼀个⼩数点组合在⼀起使⽤(也就是说 99.9V99 是不允许的)。
表9-24 显⽰了⼀些 to_char 函数的⽤法。
表9-24. 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(-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, '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'

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。