?
This document uses PHP Chinese website manual Release
PostgreSQL格式化函數(shù)提供一套有效的工具用于把各種數(shù)據(jù)類型(date/time, integer, floating point, numeric) 轉(zhuǎn)換成格式化的字符串以及反過(guò)來(lái)從格式化的字符串轉(zhuǎn)換成指定的數(shù)據(jù)類型。表Table 9-20列出了這些函數(shù)。 這些函數(shù)都遵循一個(gè)公共的調(diào)用約定: 第一個(gè)參數(shù)是待格式化的值,而第二個(gè)是定義輸出或輸入格式的模板。
to_timestamp
函數(shù)一個(gè)參數(shù)也是可用的。它接受一個(gè)double precision參數(shù),
轉(zhuǎn)換從Unix 紀(jì)元(自1970-01-01 00:00:00+00起的秒數(shù))為timestamp with time zone。
(Integer類型的 Unix 紀(jì)元隱含地轉(zhuǎn)換成了double precision。)
Table 9-20. 格式化函數(shù)
函數(shù) | 返回類型 | 描述 | 示例 |
---|---|---|---|
to_char(timestamp,text) |
text | 將時(shí)間戳轉(zhuǎn)換成字符串 | to_char(current_timestamp, 'HH12:MI:SS') |
to_char(interval,text) |
text | 把時(shí)間間隔轉(zhuǎn)為字符串 | to_char(interval '15h?2m?12s', 'HH24:MI:SS') |
to_char(int,text) |
text | 將整數(shù)轉(zhuǎn)換成字符串 | to_char(125, '999') |
to_char (double precision,
text) |
text | 將實(shí)數(shù)/雙精度數(shù)轉(zhuǎn)換成字符串 | to_char(125.8::real, '999D9') |
to_char(numeric,text) |
text | 將數(shù)字轉(zhuǎn)換成字符串 | to_char(-125.8, '999D99S') |
to_date(text,text) |
date | 將字符串轉(zhuǎn)換成日期 | to_date('05?Dec?2000', 'DD?Mon?YYYY') |
to_number(text,text) |
numeric | 將字符串轉(zhuǎn)換成數(shù)字 | to_number('12,454.8-', '99G999D9S') |
to_timestamp(text,text) |
timestamp with time zone | 將字符串轉(zhuǎn)換成帶時(shí)區(qū)的時(shí)間戳 | to_timestamp('05?Dec?2000', 'DD?Mon?YYYY') |
to_timestamp(double precision) |
timestamp with time zone | 將 UNIX 紀(jì)元轉(zhuǎn)換成時(shí)間戳 | to_timestamp(1284352323) |
在to_char
的輸出模板字符串里,有一定的替換模式,在給定值的基礎(chǔ)上,正確地替換為相應(yīng)格式的數(shù)據(jù)。
并不是一個(gè)模板模式的任何文本只是逐字復(fù)制。同樣,在一個(gè)輸入模板字符串里(的其它函數(shù)),
模板模式標(biāo)識(shí)著要提供輸入數(shù)據(jù)字符串的格式值。
Table 9-21顯示了可以用于格式化日期和時(shí)間值的模版。
Table 9-21. 用于日期/時(shí)間格式化的模式
模式 | 描述 |
---|---|
HH | 一天的小時(shí)(01-12) |
HH12 | 一天的小時(shí)(01-12) |
HH24 | 一天的小時(shí)(00-23) |
MI | 分鐘(00-59) |
SS | 秒(00-59) |
MS | 毫秒(000-999) |
US | 微秒(000000-999999) |
SSSS | 午夜后的秒(0-86399) |
AM,am, PMorpm下午標(biāo)識(shí)(大寫(xiě)) | 正午標(biāo)識(shí)(沒(méi)有間隔符) |
A.M.,a.m., P.M.orp.m.上下午標(biāo)識(shí)(小寫(xiě)) | 正午標(biāo)識(shí) (有間隔符) |
Y,YYY | 帶逗號(hào)的年(4 和更多位) |
YYYY | 年(4 和更多位) |
YYY | 年的后三位 |
YY | 年的后兩位 |
Y | 年的最后一位 |
IYYY | ISO年(4 位或更多位) |
IYY | ISO年的后三位 |
IY | ISO年的后兩位 |
I | ISO年的后一位 |
BC,bc, ADorad | 紀(jì)元標(biāo)識(shí)(沒(méi)有間隔符) |
B.C.,b.c., A.D.ora.d. | 紀(jì)元標(biāo)(有間隔符) |
MONTH | 大寫(xiě)的月份全名(空白填充為9個(gè)字符) |
Month | 首字母大寫(xiě)的月份全名(空白填充為9個(gè)字符) |
month | 小寫(xiě)的月份全名(空白填充為9個(gè)字符) |
MON | 大寫(xiě)的月份縮寫(xiě)名(英文為3個(gè)字符,本地化長(zhǎng)度不定) |
Mon | 首字母大寫(xiě)的月份縮寫(xiě)名(英文為3個(gè)字符,本地化長(zhǎng)度不定) |
mon | 小寫(xiě)的月份縮寫(xiě)名(英文為3個(gè)字符,本地化長(zhǎng)度不定) |
MM | 月數(shù)(01-12) |
DAY | 大寫(xiě)的天全名(空白填充為9個(gè)字符) |
Day | 首字母大寫(xiě)的天全名(空白填充為9個(gè)字符) |
day | 小寫(xiě)的天全名(空白填充為9個(gè)字符) |
DY | 大寫(xiě)天的縮寫(xiě)名(英文為3個(gè)字符,本地化長(zhǎng)度不定) |
Dy | 首字母大寫(xiě)的天縮寫(xiě)名(英文為3個(gè)字符,本地化長(zhǎng)度不定) |
dy | 小寫(xiě)天的縮寫(xiě)名(英文為3個(gè)字符,本地化長(zhǎng)度不定) |
DDD | 年中天數(shù)(001-366) |
IDDD | ISO 年中天數(shù) (001-371; 年中的第1天為ISO第一周的星期一) |
DD | 月里的天數(shù)(01-31) |
D | 周中天數(shù), 一周里的日(1-7 ;星期天是 1,星期六是 7) |
ID | ISO 周中天數(shù),(1-7:星期一是 1,星期天是 7) |
W | 月中周數(shù) (1-5)(第一周從該月第一天開(kāi)始) |
WW | 年中周數(shù) (1-53)(第一周從該年的第一天開(kāi)始) |
IW | ISO 年中周數(shù) (01 - 53; 第一個(gè)星期四所在周為第1周) |
CC | 世紀(jì)(2 位)(20 世紀(jì)從 2001-01-01 開(kāi)始) |
J | 儒略日(自公元前 4712 年 1 月 1 日來(lái)的天數(shù)) |
Q | 季度(to_date 和to_timestamp 忽略) |
RM | 羅馬數(shù)字的月份(I-XII ;I=JAN)(大寫(xiě)) |
rm | 羅馬數(shù)字的月份(I-XII ;I=JAN)(小寫(xiě)) |
TZ | 時(shí)區(qū)名(大寫(xiě)) |
tz | 時(shí)區(qū)名(小寫(xiě)) |
有一些修飾詞可以應(yīng)用于模板來(lái)修改它們的行為。例如,FMMonth就是帶著FM前綴 的Month模式。表Table 9-22顯示了用于日期/時(shí)間格式化的修飾詞模式。
Table 9-22. 日期/時(shí)間格式化的模板模式修飾詞
修飾符 | 描述 | 示例 |
---|---|---|
FM前綴 | 填充模式(支持填充空白和零) | FMMonth |
TH后綴 | 大寫(xiě)序號(hào)后綴 | DDTH, 例如,12TH |
th后綴 | 小寫(xiě)序號(hào)后綴 | DDth, 例如,12th |
FX前綴 | 固定格式的全局選項(xiàng)(見(jiàn)用法須知? | FX?Month?DD?Day |
TM前綴 | 翻譯模式(基于lc_time顯示本地化的日期和月份名) | TMMonth |
SP后綴 | 拼寫(xiě)模式(還未實(shí)現(xiàn)) | DDSP |
日期/時(shí)間格式化的用法說(shuō)明:
FM抑制前導(dǎo)的零或尾跟的空白,如果沒(méi)有使用它的話, 會(huì)在輸出中增加這些填充最終把輸出變成固定寬度的模式。 在PostgreSQL中,FM僅修改下一步的規(guī)范, 當(dāng)OracleFM會(huì)影響后續(xù)的所有規(guī)范,而且反復(fù)FM 修飾詞切換填充模式的開(kāi)關(guān)。
TM不包含結(jié)尾空白.
to_timestamp
和to_date
會(huì)跳過(guò)多個(gè)空白,
除非在輸入字符串中使用FX選項(xiàng).舉例如下,
to_timestamp('2000????JUN', 'YYYY MON')運(yùn)行正常, 但是
to_timestamp('2000????JUN', 'FXYYYY MON')返回錯(cuò)誤,
因?yàn)?code class="FUNCTION">to_timestamp僅期望出現(xiàn)了一個(gè)空格。FX必須指定為模板的
第一個(gè)項(xiàng)目。
在to_char
模板里可以有普通文本,并且它們會(huì)被逐字輸出。
你可以把一個(gè)字符串放到雙引號(hào)里強(qiáng)迫它解釋成一個(gè)文本,即使它里面包含模式關(guān)鍵字也如此。例如,
'"Hello Year "YYYY'中的YYYY將替換為
年份數(shù)據(jù),但是不會(huì)替換Year里的單個(gè)Y。
在to_date
,to_number
,和to_timestamp
,雙引號(hào)的字符串會(huì)跳過(guò)輸入的字符串相應(yīng)數(shù)目的字符,例如"XX"
跳過(guò)兩個(gè)輸入字符。
如果你想在輸出里有雙引號(hào),那么你必須在它們前面放雙反斜杠, 例如E'\\"YYYY Month\\"' (需要兩個(gè)反斜杠是因?yàn)榉葱备茉谑褂锰右葑址Z(yǔ)法里,有特殊含義)。
如果你使用的年份長(zhǎng)于4位字符,那么用YYYY從字符串向 timestamp或date做轉(zhuǎn)換時(shí)要受到限制。你必須在YYYY后面使用 一些非數(shù)字字符或者模板,否則年份總是解釋為 4 位數(shù)字。比如 對(duì)于 20000 年:to_date('200001131', 'YYYYMMDD')將會(huì) 被解釋成一個(gè) 4 位數(shù)字的年份,最好在年后面使用一個(gè)非數(shù)字的分隔符,像 to_date('20000-1131', 'YYYY-MMDD')或 to_date('20000Nov31', 'YYYYMonDD'). 。
在從字符串向timestamp或date轉(zhuǎn)換的時(shí)候,如果有YYY,YYYY或 Y,YYY字段,那么CC字段會(huì)被忽略。如果CC與YY或Y一起使用, 那么年份用公式(CC-1)*100+YY計(jì)算。
An ISO week date (as distinct from a Gregorian date) can be
specified toto_timestamp
and
to_date
in one of two ways:
可以通過(guò)to_timestamp
和to_date
兩種方法之一,指定一個(gè)ISO周日期(與公歷日期不同):
格式:年, 周, 和 周天: 例如to_date('2006-42-4', 'IYYY-IW-ID')返回日期為2006-10-19。 如果忽略了周天,將默認(rèn)為1(星期一)。
格式:年 和年中的天數(shù): 例如to_date('2006-291', 'IYYY-IDDD')也是返回2006-10-19。
嘗試構(gòu)造一個(gè)混合使用ISO周日期和公歷日期字段是沒(méi)有意義的,將導(dǎo)致錯(cuò)誤。 在一個(gè)ISO年的情況下,"月"或"月中天數(shù)"的概念已經(jīng)沒(méi)有意義。 在公歷年的情況下,ISO 周 沒(méi)有意義。用戶應(yīng)避免混合公歷和ISO日期表示。
將字符串轉(zhuǎn)化為timestamp時(shí),毫秒(MS)和微秒(US)都是用字符串的 小數(shù)點(diǎn)后面的部分轉(zhuǎn)換的。如to_timestamp('12:3', 'SS:MS') 不是 3 毫秒, 而是 300 毫秒,因?yàn)檗D(zhuǎn)換把它看做 12+0.3 秒。這意味 著對(duì)于格式SS:MS而言,輸入值12:3,12:30,12:300聲明了相同的毫秒數(shù)。 對(duì)于 3 毫秒,你必須使用12:003,那么轉(zhuǎn)換會(huì)把它看做 12+0.003 = 12.003 秒。
這個(gè)更復(fù)雜的例子to_timestamp('15:12:02.020.001230', 'HH:MI:SS.MS.US') 是 15小時(shí)、12分鐘、2秒+20毫秒+1230微秒 = 2.021230秒。
to_char(..., 'ID')
的周天數(shù)匹配函數(shù)extract(isodow from ...)
,但是to_char(..., 'D')
不匹配extract(dow from ...)
的天數(shù)。
to_char(interval)
格式HH和
HH12作為12小時(shí)時(shí)鐘顯示, 即 zero 小時(shí)
和 36 hours 輸出為12, 當(dāng)HH24
輸出整小時(shí)值, 可以為超過(guò)23的間隔。
在Table 9-23中顯示可用于數(shù)值格式化的模板模式。
Table 9-23. 數(shù)值格式化的模版模式。
模式 | 描述 |
---|---|
9 | 帶有指定數(shù)值位數(shù)的值 |
0 | 帶前導(dǎo)零的值 |
.(period) | 小數(shù)點(diǎn) |
,(comma) | 分組(千)分隔符 |
PR | 尖括號(hào)內(nèi)負(fù)值 |
S | 帶符號(hào)的數(shù)值(使用區(qū)域設(shè)置) |
L | 貨幣符號(hào)(使用區(qū)域設(shè)置) |
D | 小數(shù)點(diǎn)(使用區(qū)域設(shè)置) |
G | 分組分隔符(使用區(qū)域設(shè)置) |
MI | 在指明位置的負(fù)號(hào)(如果數(shù)字< 0) |
PL | 在指明位置的正號(hào)(如果數(shù)字 >0) |
SG | 在指明位置的正/負(fù)號(hào) |
RN | 羅馬數(shù)字(輸入在 1 和 3999 之間) |
THorth | 序數(shù)后綴 |
V | 移動(dòng)指定位數(shù)(參閱注解) |
EEEE | 指數(shù)為科學(xué)記數(shù)法科學(xué)記數(shù)(尚未實(shí)現(xiàn)) |
Usage notes for numeric formatting: 數(shù)字格式化的用法須知:
使用SG,PL,MI生成的符號(hào)并不掛在數(shù)字上面;比 如,to_char(-12, 'MI9999')produces'-??12'生成to_char(-12, 'S9999')生 成'??-12'。Oracle里 的實(shí)現(xiàn)不允許在9前面使用MI,而是要求9在MI前面。
9聲明和9的個(gè)數(shù)相同的數(shù)字位數(shù)的數(shù)值。如果某個(gè)數(shù)值位沒(méi)有數(shù)字,則輸出一個(gè)空白。
TH不會(huì)轉(zhuǎn)換小于零的數(shù)值,也不會(huì)轉(zhuǎn)換小數(shù)。
PL,SG, TH是PostgreSQL擴(kuò)展
V方便地把輸入值乘以 10^n ,這里n是跟在V后面的數(shù)字。
to_char
不支持把V與一個(gè)小數(shù)點(diǎn)組合在一起使用(也就是說(shuō) 99.9V99 是不允許的)。
EEEE(科學(xué)記數(shù))不能被用來(lái)在與任何其它格式模式組合或數(shù)字和小數(shù)點(diǎn)模式之外的修飾符, 必須在格式字符串的末尾(例如,9.99EEEE的是一個(gè)有效的模式)。
某些修飾符可以應(yīng)用于模板來(lái)改變其行為。 例如,FM9999是帶有FM修飾符的模式。 在Table 9-24中數(shù)字格式的模式修飾符.
Table 9-24. 用于數(shù)值格式化的模板模式修飾詞
修飾符 | 描述 | 示例 |
---|---|---|
FMprefix | 填充模式 (禁止填充空白和零) | FM9999 |
THsuffix | 大寫(xiě)序號(hào)后綴 | 999TH |
thsuffix | 小寫(xiě)序號(hào)后綴 | 999th |
Table 9-25顯示了一些to_char
函數(shù)的用法。
Table 9-25. to_char
示例
表達(dá)式 | 結(jié)果 |
---|---|
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' |
to_char(0.0004859, '9.99EEEE') | ' 4.86e-04' |