如何將一個數字轉換為字串並且按照指定格式顯示?--TO_CHAR
1.1.1.1 如何將一個數字轉換為字串並且按照指定格式顯示?
在應用中,可能需要將0.007007040000轉換成0.70%,或需要顯示“0.00”、“1.20”等類似的資料格式,此時可以使用TO_CHAR函式來轉換。這個函式可以用來將DATE或NUMBER資料型別轉換成可顯示的字串,格式是TO_CHAR(number_type,format_mask),format_mask轉換格式有多種,如下表所示:
格式
|
含義
|
9
|
顯示數字,9表示對應的某一個指定位數的值,若值是0則忽略不顯示,若指定位數沒有值,則以空格表示。
|
0
|
顯示數字,0表示對應的某一個指定位數的值,若值是0則顯示為0,若指定位數沒有值也顯示為0。
|
FM或fm
|
FM表示將顯示出來的字串定位數沒有值而顯示的空格清理掉,作用和ltrim類似。
|
.
|
在指定位置顯示小數點。
|
,
|
在指定位置顯示逗號。
|
$
|
在數字前加美元。
|
L
|
在數字前面加本地貨幣符號。
|
C
|
在數字前面加國際貨幣符號。
|
G
|
在指定位置顯示組分隔符。
|
D
|
在指定位置顯示小數點符號(.)。
|
PR
|
尖括號內負值。
|
MI
|
在指明的位置的負號(如果數字 < 0)。
|
PL
|
在指明的位置的正號(如果數字 > 0)。
|
S
|
帶負號的負值(使用本地化)。
|
SG
|
在指明的位置的正/負號。
|
RN
|
羅馬數字(輸入在 1 和 3999 之間)。
|
TH或th
|
轉換成序數。
|
V
|
移動 n 位(小數)
|
EEEE
|
科學記數。現在不支援。
|
需要注意的是,在NUMBER型別轉換為字串時,負數會返回前面包含負號的字串,正數則會返回前面包含空格的字串,除非格式模式包含MI、S、或PR元素。即LENGTH(TO_CHAR(4, '0000'))的值其實是5,所以需要使用FM格式或ltrim去掉空格。示例如下所示:
SYS@PROD1> SELECT TO_CHAR(0.00, 'FM9999999999999999990.00') A,
2 TO_CHAR(ROUND(0.007007040000, 4) *
100, 'FM99999999990.90') || '%' AS B,
3 LENGTH(TO_CHAR(4, '0000')) C,
4 LENGTH(TO_CHAR(4, 'FM0000')) C1,
5 LENGTH(LTRIM(TO_CHAR(4, '0000'))) C2
6 FROM DUAL;
A B C C1 C2
-----------------------
---------------- ---------- ---------- ----------
0.00 0.70% 5 4 4
真題1、 如何將數字格式化顯示並且依然返回數值型別?
答案:可以使用CAST函式,示例如下所示:
SYS@PROD1> SELECT CAST(1234.4 AS NUMBER(10, 2))
AS A,
2 CAST(12 AS NUMBER(10, 2)) AS B,
3 CAST(0 AS NUMBER(10, 2)) AS C,
4 CAST('1234.4' AS NUMBER(10, 2)) AS A1,
5 CAST('12' AS NUMBER(10, 2)) AS B1,
6 CAST('0' AS NUMBER(10, 2)) AS C1
7 FROM DUAL;
A B C A1 B1 C1
------------
------------ ------------ ------------ ------------ ------------
1234.40 12.00 0.00 1234.40 12.00 0.00
oracle to_char函式將number轉成string
很多資料轉換處理操作時,會遇到將0.007007040000轉換成0.70%的需求,我們使用Oracle 的SQL 函式 to_char可以實現這種轉換。
這個函式用來將DATE或NUMBER資料型別轉換成可顯示的字串,格式是to_char(number_type, format_mask)。
格式'999.99',9表示對應的某一個指定位數的值,如果是值是0則忽略不顯示,如果指定位數沒有值,則以空格表示。
格式'0990.990',0表示對應的某一個指定位數的值,如果是值是0則顯示為0,如果是沒有值也顯示為0。
格式'FM990.90',FM表示將顯示出來的字串定位數沒有值而顯示的空格清理掉,作用和ltrim類似。
以下為程式碼示例:
-
SQL> select to_char(12304.560,'999.99') from dual;
-
TO_CHAR(12304.560,'999.99')
-
-
#######
-
SQL> select to_char(104.560,'999.99') from dual;
-
TO_CHAR(104.560,'999.99')
-
-
104.56
-
SQL> select to_char(104.560,'99999.99') from dual;
-
TO_CHAR(104.560,'99999.99')
-
-
104.56
-
SQL> select to_char(104.560,'99999.990') from dual;
-
TO_CHAR(104.560,'99999.990')
-
-
104.560
-
SQL> select to_char(104.560,'0099.990') from dual;
-
TO_CHAR(104.560,'0099.990')
-
-
0104.560
-
-
SQL>
-
SQL> select to_char(round(0.007007040000, 4) * 100, 'FM99999999990.90') || '%' as aa,
-
2 length(to_char(round(0.007007040000, 4) * 100, 'FM99999999990.90') || '%') as bb
-
3 from dual;
-
AA BB
-
-
0.70% 5
-
SQL>
-
SQL> select to_char(round(0.007007040000, 4) * 100, '99999999990.90') || '%' as aa,
-
2 length(to_char(round(0.007007040000, 4) * 100, '99999999990.90') || '%') as bb
-
3 from dual;
-
AA BB
-
-
0.70% 16
這是to_char將數字轉換成字串的常見操作功能,還有其他一些格式,見to_char(numeric)的格式模板:
-
模板 描述
-
9 帶有指定位數的值
-
0 前導零的值
-
. (句點) 小數點
-
, (逗號) 分組(千)分隔符
-
PR 尖括號內負值
-
S 帶負號的負值(使用本地化)
-
L 貨幣符號(使用本地化)
-
D 小數點(使用本地化)
-
G 分組分隔符(使用本地化)
-
MI 在指明的位置的負號(如果數字 < 0)
-
PL 在指明的位置的正號(如果數字 > 0)
-
SG 在指明的位置的正/負號
-
RN 羅馬數字(輸入在 1 和 3999 之間)
-
TH or th 轉換成序數
-
V 移動 n 位(小數)
-
EEEE 科學記數。現在不支援。
-
2015-12-28 23:45 by 瀟湘隱者, 2736 閱讀, 評論, 收藏, 編輯
在這篇部落格SQL挑戰——如何高效生成編碼裡面我由於需要將數字格式化為字元,像12需要格式化0012這樣的字元,所以使用了TO_CHAR(數字,'0000')這樣的寫法,後面0000表示預設補零,測試過程中,我發發現TO_CHAR(number,'0000') 會多一個空格。有點納悶為什麼了會多一個空格。
後面經過檢視官方文件、同事討論以及網友提供的資料,終於把這個問題給弄清楚了。下面梳理、總結於此,希望對其它人有所幫助。
在官方文件裡面你能看到一段介紹
Number Format Elements
A number format model is composed of one or more number format elements. The tables that follow list the elements of a number format model and provide some examples.
Negative return values automatically contain a leading negative sign and positive values automatically contain a leading space unless the format model contains the MI, S, or PR format element.
注意紅色部分,意思是Number型別轉換為字元時,負數會返回前面包含負號的字串,正數則會返回前面包含空格的字串,除非格式模式包含MI、S、或PR元素。檢視TO_CHAR(4, '0000')返回的字串長度,你會發現其長度為5.
1: SQL> SELECT TO_CHAR(4, '0000') FROM DUAL;
2:
3: TO_CH
4: -----
5: 0004
6:
7: SQL> SELECT LENGTH(TO_CHAR(4, '0000')) FROM DUAL;
8:
9: LENGTH(TO_CHAR(4,'0000'))
10: -------------------------
11: 5
12:
13: SQL> SELECT TO_CHAR(-4, '0000') FROM DUAL;
14:
15: TO_CH
16: -----
17: -0004
那麼如何解決這個問題呢,目前有兩種方法,一種方法是用TRIM去空格,另外一種是使用引數MI(MI引數是正數的空格放到字串後面,將負數的負號放置在字串後面),關於引數MI的解釋如下所示:
Returns negative value with a trailing minus sign (-).
Returns positive value with a trailing blank.
Restriction: The MI format element can appear only in the last position of a number format model.
返回負值與尾隨的負號 (-)。
返回正值尾隨空白。
限制: MI 格式元素可以只能出現在數字的格式模式的最後一個位置。
其實這些還只是TO_CHAR函式的冰山一角,如果你通讀文件那麼你會發現其實你所掌握的TO_CHAR函式還只是個皮毛而已。一個TO_CHAR函式如此強大,可見ORACLE的博大精深。
參考資料:
http://blog.163.com/wangpeng126_2009@126/blog/static/121022611201454111640254/
oracle使用to_char把數字轉換成字串時有空格
Oracle to_char():數字轉字串,結果新增空格:
select to_char(12,'00') from dual
字串是 ' 12',前面多了一個空格,
select length(to_char(12,'00')) from dual
返回結果是:3
返回的字串總是前面有個空格。原因:
那個空格位置是放符號的,正的數字就空了,負的就是一個‘-’號而沒有空格。
這是網上流傳的原因:
FM
Fill mode. Oracle uses blank characters to fill format elements to a constant width equal to the largest element for the relevant format model in the current session language. For example, when NLS_LANGUAGE is AMERICAN, the largest element for MONTH is SEPTEMBER, so all values of the MONTH format element are padded to 9 display characters. This modifier suppresses blank padding in the return value of the TO_CHAR function:
In a datetime format element of a TO_CHAR function, this modifier suppresses blanks in subsequent character elements (such as MONTH) and suppresses leading zeroes for subsequent number elements (such as MI) in a date format model. Without FM, the result of a character element is always right padded with blanks to a fixed length, and leading zeroes are always returned for a number element. With FM, which suppresses blank padding, the length of the return value may vary.
In a number format element of a TO_CHAR function, this modifier suppresses blanks added to the left of the number, so that the result is left-justified in the output buffer. Without FM, the result is always right-justified in the buffer, resulting in blank-padding to the left of the number.
Track back
解決辦法:
select trim(to_char(12,'00')) from dual
或者
select to_char(12,'fm00') from dual
總結:
select to_char(12,'00000') from dual 結果為:
00012(1個空格)
select to_char(12,'99999') from dual 結果為:
12(4個空格)
select to_char(-12,'00000') from dual 結果為:
-00012(無個空格)
select to_char(-12,'99999') from dual 結果為:
-12(3個空格)
轉自:
Oracle資料庫,數字強制顯示2位小數
今遇到一個需求,如題,要求將數字以兩位小數的格式顯示,如果沒有小數,則強制顯示為0。
例如:
123.4 顯示為 123.40
12 顯示為 12.00
0 顯示為 0.00
本以為這是個比較簡單的問題,Oracle本身提供了to_char函式,帶有格式化功能,能夠滿足條件:
-
select to_char(123.4, '9999990.00') as aa from dual;
-
select to_char(12, '9999990.00') as aa from dual;
-
select to_char(0, '9999990.00') as aa from dual;
-
-
select to_char(123.4, 'fm9999990.00') as aa from dual;
-
select to_char(12, 'fm9999990.00') as aa from dual;
-
select to_char(0, 'fm9999990.00') as aa from dual;
至此,本以為問題解決了,但是卻沒有注意到,以上的語句格式化的是字串,而不是數字!!
需求中,很明確的要求,將數字格式化,結果仍然為數字。
分析:該需求是一個非常常見、且正常的需求,既然Oracle如此強大,應該會提供相關的方法,
於是乎,查詢Oracle的相關文件,終於,找到個有個cast函式,該函式負責型別轉換,嘗試之。
結果顯示,該方法確實可行。測試SQL語句如下:
-
select CAST(1234.4 AS NUMBER (10, 2) ) as aa from dual ;
-
select CAST(12 AS NUMBER (10, 2) ) as aa from dual ;
-
select CAST(0 AS NUMBER (10, 2) ) as aa from dual ;
PS:追加一點,字串可以直接進行型別轉換,而無需使用to_number()函式做中間轉換。SQL語句如下:
-
select CAST('1234.4' AS NUMBER (10, 2) ) as aa from dual ;
-
select CAST('12' AS NUMBER (10, 2) ) as aa from dual ;
-
select CAST('0' AS NUMBER (10, 2) ) as aa from dual ;
PS:追加第二點,網上看到有人說,小數點後是否顯示完全,PL/SQL的版本有關。
本人未做驗證,不發表個人意見,僅在此記錄一下,如以後遇到問題,再行驗證。
關於處理小數點位數的幾個oracle函式() 1. 取四捨五入的幾位小數 select round(1.2345, 3) from dual;
結果:1.235 2. 保留兩位小數,只舍 select trunc(1.2345, 2) from dual;
結果:1.23 select trunc(1.2399, 2) from dual;
結果:1.23 3.取整數
返回大於或等於x的最大整數:
SQL> select ceil(23.33) from dual;
結果: 24 返回等於或小於x的最大整數:
SQL> select floor(23.33) from dual;
結果: 23 返回舍入到小數點右邊y位的x值:rcund(x,[y])
SQL> select round(23.33) from dual;
結果: 23 返回截尾到y位小數的x值:trunc(x,[y])
SQL> select trunc(23.33) from dual;
結果: 23 格式化數字
The following are number examples for the to_char function.
to_char(1210.73, '9999.9') would return '1210.7' to_char(1210.73, '9,999.99') would return '1,210.73' to_char(1210.73, '$9,999.00') would return '$1,210.73' to_char(21, '000099') would return '000021' to_char函式特殊用法
to_char(sysdate,'d') 每週第幾天
to_char(sysdate,'dd') 每月第幾天
to_char(sysdate,'ddd') 每年第幾天
to_char(sysdate,'ww') 每年第幾周
to_char(sysdate,'mm') 每年第幾月
to_char(sysdate,'q') 每年第幾季
to_char(sysdate,'yyyy') 年
比如要找某個時間為每週第幾天就可以
SQL> select to_char(to_date('20070101','yyyymmdd'),'d') from dual; 1.instr
在Oracle/PLSQL中,instr函式返回要擷取的字串在源字串中的位置。
語法如下:instr( string1, string2 [, start_position [, nth_appearance ] ] )
string1 源字串,要在此字串中查詢。
string2 要在string1中查詢的字串.
start_position 代表string1 的哪個位置開始查詢。此引數可選,如果省略預設為1. 字串索引從1開始。如果此引數為正,從左到右開始檢索,如果此引數為負,從右到左檢索,返回要查詢的字串在源字串中的開始索引。
nth_appearance 代表要查詢第幾次出現的string2. 此引數可選,如果省略,預設為 1.如果為負數系統會報錯。
注意:
如果String2在String1中沒有找到,instr函式返回0.
應用於:
Oracle 8i, Oracle 9i, Oracle 10g, Oracle 11g
舉例說明: select instr('abc','a') from dual; -- 返回 1 select instr('abc','bc') from dual; -- 返回 2 select instr('abc abc','a',1,2) from dual; -- 返回 5 select instr('abc','bc',-1,1) from dual; -- 返回 2 select instr('abc','d') from dual; -- 返回 0 注:也可利用此函式來檢查String1中是否包含String2,如果返回0表示不包含,否則表示包含。
一 ,TO_CHAR(NUMBER)
1.1 格式圖和簡單說明
本函式把引數N轉為一個VARCHAR2型別的數值。N可以是NUMBER,BINARY_FLOAT,或者BINARY_DOUBLE。如果不帶格式,那麼函式會把N轉換為足以表示N的VARCHAR2字串。
格式表參考:
序號
|
格式
|
簡例
|
說明
|
1
|
,(逗號)
|
'9999,999'
|
逗號,一般以千分位出現,作為分組符號使用.如果需要您也可以當作是十分位,百分位出現,可以出現N次,視乎數字的大小而定.
變態的例子是 to_char(1234,'9,9,9,9').
注意事項:只能出現在整數部分.
|
2
|
.(點號)
|
'99.99'
|
點號,不要念為"句號",句號是個圓圈,點好只能出現在小數點對應的地方.只能出現一次.
to_char(1234.34,'9,9,9,9.99')
注意事項:只能出現在一個地方,就是原來資料小數點位置
|
3
|
$(美元符號)
|
'$999.99'
|
美元.其實你可以放在任意地方(在10G下)
to_char(1234.34,'9,9,9,9.$99')
注意事項:只能出現一次.
|
4
|
0(零)
|
'0999.99'
|
零.在對應位置返回對應的字元,如果沒有則以'0'填充.
to_char(0.34,'9,9,9,0.$99')='$0.34';to_char(1234,'9999.00')='1234.00';
注意事項:這是一個強制的符號,對應位沒有,則以'o'填充,這是9很大不同地方
|
5
|
9
|
'999.99'
|
9.在小數位,則表示轉換為對應字元,如果沒有則以0表示;在整數位,沒有對應則不填充字元.
to_char(123,'999.99')=123.00; TO_CHAR(123,'99999.9')=123.0;
注意事項:對於0和9而言,如果格式的位數不如數字的位數多,會返回'#'.
譬如to_char(12345,'9999')='#####'
|
6
|
B(空格符)
|
'B999'
|
沒有其它特別作用,在整數部分最前面加一個空格,可以出現在任意位置.
'S'||TO_CHAR(1234,'99B99')='S 1234';
注意事項:只能出現在整數部位.
|
7
|
C(國際貨幣符號)
|
'C9999'
|
在特定的位置返回一個ISO貨幣符號(就是NLS_ISO_CURRENCY引數所代表的值)
TO_CHAR(1233,'C9999')='CNY1234' ,這是新的國際標準RMB,關於這個可查詢"國際貨幣符號"
注意事項:只能出現在整數部位第一位.
可以透過alter session set NLS_ISO_CURRENCY='JAPAN';來修改當前會話的設定.
|
8
|
D(ISO 小數位符號)
|
'999D99'
|
這是"點號"的國際版本(ISO),作用等同於點號,也是隻能出現一次.所不同的是,資料庫會根據NLS_NUMERIC_CHARACTER的引數值來設定內容.預設的這個值是點號.
注意事項:沒有特別需要一般不要用這個格式符號.也不要輕易修改引數值.
也可用alter sesssion set 來修改.
alter session set nls_numeric_characters='!,'; to_char(1234.34,'9999d99')=1234!34
|
9
|
EEEE(科學計算符)
|
9.9EEEE
|
科學計算符號
TO_CHAR(2008032001,'9.9EEEE')='2.01E+09',由於是科學計算方法,所以小數位前面加一個9或者0即可,多個是沒有意義的.
|
10
|
G(分組符號)
|
999G999
|
是逗號(,)的的ISO標準,作為分組符號使用,可以放在多個地方使用.
TO_CHAR(123456,'999G9G99')=123,4,56
注意事項:同第八項 -D, 此外如果要轉換出小數點,則要和D配合使用,不能和點號配合.
|
11
|
L(本地貨幣符號)
|
'L999'
|
是C的本地版本.可以放在整個格式的最前面和最後面.
TO_CHAR(123456,'999G9G99D00L')=123,4,56.00¥
注意事項:同第七項 C
|
12
|
MI(負號)
|
'9999MI'
|
如果是負數,在尾部加上負號(-),如果是正數,則尾巴加上空格
to_char(1234,'9999mi')||'S'||TO_CHAR(-5678,'9999MI') =1234 S5678-
注意事項:只能放在格式尾巴
|
13
|
PR(符號)
|
9999PR
|
是表達負數的另外一種方式.如果是正數,則頭部加上空格;如果是負數,則用小簡括號<>把數字包起來.
TO_CHAR(-1234.89,'9G999D00PR')=<1,234.89>
注意事項:同12
|
14
|
RN(rn)
|
RN(rn)
|
把整數(1-3999)轉換為羅馬字元.RN表示轉為大寫,rn表示小寫的.
declare
i int;
begin
for i in 1..20 loop
dbms_output.put_line(to_char(i,'RN'));
end loop;
end;
注意事項:只能自己使用,不能和其它符號組合使用.
|
15
|
S
|
'9999S'
|
是12,13的綜合改進版本.為整數加一個正號+,為負數加一個符號-.S在前則加在前,在後則在後.
TO_CHAR(-1234,'S9999')=-1234;TO_CHAR(1234,'S9999')=+1234
|
16
|
TM
|
TM9/TMe
|
使用這個引數等於沒有用引數to_char(number)一樣,應為'tm9'是預設的格式引數.
to_char(1234,'tme')=1234
注意事項:格式要麼是TM9,要麼是TME.
當數字長度超過64位時候,TM9的輸出等同於TME的輸出.
|
17
|
U
|
U999
|
雙幣符號,例如歐元.作用同11的L
TO_CHAR(999,'U999')=¥999
注意事項:透過NLS_DUAL_CURRENCY 控制
|
18
|
V
|
999V9
|
這是個比較古怪,又不是很常使用的符號。它的作用在於做一個計算。
例如TO_CHAR(N,'999V9'),以p表示V的位置,則該表示式=to_char(N×(10的P-1次方)).但是9個數又必須保證大於等於乘積之後表示的位數.
TO_CHAR(5,'9V')=5*1=5;
TO_CHAR(5,'9V9')=5*10=50
TO_CHAR(5,'9V99')=500
TO_CHAR(50,'9V99')='######' 9的個數不夠
注意事項:格式中不能和小數表達寫在一起,但是可以混合貨幣等。
|
19
|
X
|
xxxx
|
轉換為16進位制。
TO_CHAR(100,'XX')= 64
注意事項:數值必須是大於等於0的整數。前面只能和0或者FM組合使用.
|
20
|
|
|
透過以上的例子,我們瞭解了各種數字的格式。可以說格式太多樣,難於記在腦子,最好是作為一個參考存在著.
歸類:
數值類: 0,9,
分組類: (.),(,),D,G ,其中點好和逗號因為表示不明顯,所以用小括號凸顯。
貨幣類: $,C,L,U
計算轉換類:EEEE,RN,V,X
正負符號:MI,PR,S
其它類:B
正統類:TM
|
1.2 格式說明
從上圖可以看到格式是可選取的,保留字fmt也不是必須的,關鍵是NLSPARAM的意思,
從第2-54章節(FORMAT MODELS)檢視。
NLSPARAM可以是這樣 'NLS_NUMERIC_CHARACTERS = ''dg'' NLS_CURRENCY = ''text'' NLS_ISO_CURRENCY = territory '
舉例:(待續)
SELECT TO_CHAR(-10000, 'C99G999D99PR',
'NLS_NUMERIC_CHARACTERS=''._'' NLS_ISO_CURRENCY=''UNITED KINGDOM''') "Amount"
FROM DUAL;
結果返回:
如果要了解可以使用的NLS_ISO_CURRENCY值,可以查詢資料庫的檢視V_$NLS_VALID_VALUES
二, TO_CHAR(CHARACTER)
把NCLOB,CLOB,NCHAR轉換為VARCHAR2.
三, TO_CHAR(DATETIME)
把日期轉化為字串.
關於這個格式,沒有什麼太好說的。它的格式主要分為兩類:簡寫單個字母(或者其復現形式)代表時間位置譬如yyyy ,mm,dd ,hh之類;其次是以英文的時間單詞的簡寫代表時間,例如mon,day,year.
下表的格式基本上也都可以用於TO_DATE, TO_TIMESTAMP, TO_TIMESTAMP_TZ, TO_YMINTERVAL,
TO_DSINTERVAL函式。
序號
|
格式
|
簡例
|
說明
|
1
|
- / , . ; :
"text"
|
略
|
時間分隔符號,除了標準的幾個,還允許用文字作為分割符號。
例如 to_char(sysdate,'YYYY"年"mm"月"dd"日"')=2008年04月24日
|
2
|
AD
A.D.
|
|
即拉丁文Anno Domini的簡寫,表示公元.會根據nls的不同轉換為公元或者ad等
無特殊注意事項
|
3
|
AM
A.M.
|
|
上午的簡寫 ,同pm, p.m. (下午) , 中文環境輸出為上午(如果是上午)
|
4
|
BC
B.C.
|
|
雖然標準的寫法是B.c. (c小寫) 或者BC,好在Oracle不講究這個。表示公元前
|
5
|
CC
SCC
|
|
返回世紀,以阿拉伯數字表示
如果年的後兩位介於01-99那麼,返回前兩位+1,否則返回前兩位
|
6
|
D
|
|
一週之中的某天,返回的是序號1-7
|
7
|
DAY
|
|
一週之中的某天,不過返回的是星期幾而已,這和語言設定有關係,在中國環境 NLS_DATE_LANGUAGE=SIMPLIFIED CHINESE ,用星期一到星期天表示
|
8
|
DD
|
|
月份中的某天(1-31)
|
9
|
DDD
|
|
年份中的某天(1-366)
|
10
|
DL
|
'DL'
|
返回長的日期格式。受到NLS_TERRITORY,NLS_LANGUAGE引數控制。例 2008年4月28日 星期一
限制:除了DL,其它什麼的都不能設定。
|
11
|
DS
|
|
返回短的日期格式。受到NLS_TERRITORY,NLS_LANGUAGE引數控制。 例如 2008-04-28
限制:除了DL,其它什麼的都不能設定。
|
12
|
DY
|
|
日期的簡稱,就是星期幾(當然這指的是中國環境下)
|
13
|
E
|
|
紀元簡稱,但是隻適合以下集中日曆:日本皇室,中華民國,太過佛曆
|
14
|
EE
|
|
紀元全程,適合情況同E
|
15
|
FF [1..9]
|
|
就是毫秒,如果不更上數字就是用預設的精度。
只能用於timestamp型別的。
|
16
|
FM
|
|
值得注意的一個函式:不返回任何內容。
有點不明白oracle為什麼設定這個東西.
|
17
|
FX
|
|
同上
|
18
|
HH
|
|
表示小時,為12小時制,同hh12(1-12)
|
19
|
HH12
|
|
表示小時,為12小時制(1-12)
|
20
|
HH24
|
|
表示小時,為24小時制(0-23)
|
21
|
IW
|
|
ISO標準的星期序號(1-52,或者1-53)
|
22
|
IYYY
IYY
IY
I
|
|
IYY,IY,I, ISO年(4位)的4,3,2,1位數字(倒數)
to_char(to_date(21120401,'yyyymmdd'),'iyyy, iyy,iy,i')=2112, 112,12,2
|
23
|
J
|
|
儒略日(多用於天文的一種日曆),從公元前4712年一月一日算起,得出的結果是個整數,演算法大體為 (公元日期+4712)*儒略日曆年平均天數
|
24
|
MI
|
|
秒(0-59)
|
25
|
MM
|
|
2位月(1-12)
|
26
|
MON
|
|
月的簡稱,和國家有關係NLS_DATE_LANGUAGE,例如04在中文環境下用4月表示.
|
27
|
MONTH
|
|
月的名稱,國家有關係NLS_DATE_LANGUAGE,目前在中文下04表示為4月。
|
28
|
PM
P.M.
|
|
同am,a.m.表示下午
|
29
|
Q
|
|
季度(1-4)
|
30
|
RM
|
|
用羅馬數字表示的月份,I ,II ,III ,IV ,V ,VI ,VII ,VIII,IX ,X ,XI ,XII
|
31
|
RR
|
|
有點四捨五入表示年的意思,具體的用法有那麼一點點複雜。
以s表示輸入的年份最後兩位,c表示當前的年份最後兩位,其輸出結果(新的年份前兩位)可以用函式r=f(s,c)來表示,s2,c2分別表示s,c的前兩位。
1)s=[0,49],c=[0,49],則r=c2
2) s=[0,49],c=[50,99],則 r=c2+1
3) s=[50,99],c=[0,49],則r=c2-1
4) s=[50,99],c=[50,99],則 r=c2
簡而言之就是靠近當前年份原則,如果和當前年份同區域那麼就一樣,如果比當前區域大,那麼就是當作是當前世紀前一世紀,否則就是下一個世紀。
舉例來說,以to_date為例子
SQL> select to_date('89-01-01','rr-mm-dd') ,to_date('12-01-01','rr-mm-dd') FROM DUAL;
TO_DATE('89-01-01','RR-MM-DD') TO_DATE('12-01-01','RR-MM-DD')
------------------------------ ------------------------------
1989-01-01 2012-01-01
我想oracle會搞這個東東出來,估計有兩個考慮一個是為了方便,一個是為了對付百年或者千年問題。
|
32
|
RRRR
|
|
如果輸入引數只有兩位,則同rr,否則就同yyyy作用.
|
33
|
SS
|
|
秒(0-59),一分鐘內
|
34
|
SSSSS
|
|
一天從午夜開始的累積秒數.(0-86399)
|
35
|
TS
|
|
返回短日期格式內容,包括時分秒等,只能和dl,ds組合使用,格式是:
dl ts或者dl ts ,中間以空格間隔開。TO_CHAR(SYSDATE,'TS')=下午 4:50:04
表現形式受NLS_TERRITORY 和NLS_LANGUAGE影響。
|
36
|
TZD
|
|
夏令時制資訊,時區簡寫加上夏令時資訊,必須和格式tzr設定的時區對應。
包括下面三個TZ開頭的,都是和時區相關,並不是直接用在to_char
|
37
|
TZH
|
|
時區中的小時,例如hh:mi:ss.fftzh:tzm'
|
38
|
TZM
|
|
時區中的分鐘.
|
39
|
TZR
|
|
時區中的區域資訊,必須是資料庫支援的時區,例如US/Pacific
|
40
|
WW
|
|
和iw類似,也是表示星期的序號,從年的第一天算起到年的最後一個第七天。二者取值基本相同。(1-53) ,例如2008-01-01 到2008-01-07 算1,2008-01-09~2008-01-13 算2
|
41
|
W
|
|
一個月中的星期序號,其演算法同ww,不過是侷限在一月之內而已,和iso的不同。
|
42
|
X
|
|
代表本地根符號,沒有特別用處,只能和timestamp型別一起使用.
|
43
|
Y,YYY
|
|
四位年,用都好分隔 例如2,008
|
44
|
YEAR
SYEAR
|
|
發音表達的年,例如 2008=two thousand eight
S字首表示公元前BC
|
45
|
YYYY
SYYYY
|
|
四位年,S字首表示公元前BC
|
46
|
YYY
YY
Y
|
|
一次表示後面3,2,1位的年,例如2008 可以分別取值為008,08,8
|
|
總結
|
|
從以上看,主要就是表示時間幾個部分的格式:世紀、年,月,日,時,分,秒,毫秒,以及其它一些混合格式。每個時間部分都可以有多種的表達方式,透過這樣歸類就比較容易記憶。
很多格式可以組合使用,這樣最終可以形成足夠豐富的表達其形勢;
其次很多格式和nls是密切相關的;最後某些輸出(返回)和格式大小寫是有關係的,這在中文環境下體現不出來(目前來沒有看到),但是english環境下就名下,以to_char(sysdate,'day')為例子,如果是西文環境是返回sun(假設sysdate位於週末),如果to_char(sysdate,'DAY')則返回SUN
|
|
|
|
使用前對一些不確定的先試驗一下最好,實在不行就查閱oracle的原始文件.
|
|
|
|
|
由於可以採取非常多的格式,所以實在是很靈活的.下面簡單的舉例幾個:
SQL> select to_char(sysdate,' PM yyyy-mm-dd hh24:mi:sssss AD year mon day ddd iw') FROM DUAL;
TO_CHAR(SYSDATE,'PMYYYY-MM-DDH
--------------------------------------------------------------------------------
上午 2008-03-27 09:58:35917 公元 two thousand eight 3月 星期四 087 13
SQL> SELECT TO_CHAR(SYSTIMESTAMP,'HH24:MI:SS.FF5') FROM DUAL;
TO_CHAR(SYSTIMESTAMP,'HH24:MI:
------------------------------
10:02:28.90000
SQL>SELECT TO_CHAR(SYSDATE,'DS DL') FROM DUAL
TO_CHAR(SYSDATE,'DSDL')
-----------------------------------
2008-03-27 2008年3月27日 星期四
最後一個和國家地區有關.
About Me
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/26736162/viewspace-2149299/,如需轉載,請註明出處,否則將追究法律責任。