本來這是很簡單的函數但在屢次忘記格式之後決定還是翻譯一遍以銘記在心
參考<<Oracle Database SQL Reference>>
關於nls可有取值請注意視圖sysV_$NLS_VALID_VALUES
一 TO_CHAR(NUMBER)
本函數把參數N轉為一個VARCHAR類型的數值N可以是NUMBERBINARY_FLOAT或者BINARY_DOUBLE如果不帶格式那麼函數會把N轉換為足以表示N的VARCHAR字符串
格式表參考
序號
格式 簡例 說明
(逗號) 逗號一般以千分位出現作為分組符號使用如果需要您也可以當作是十分位百分位出現可以出現N次視乎數字的大小而定
變態的例子是 to_char()
注意事項:只能出現在整數部分
(點號) 點號不要念為句號句號是個圓圈點好只能出現在小數點對應的地方只能出現一次
to_char()
注意事項:只能出現在一個地方就是原來數據小數點位置
$(美元符號) $ 美元其實你可以放在任意地方(在G下)
to_char($)
注意事項:只能出現一次
(零)
零在對應位置返回對應的字符如果沒有則以填充
to_char($)=$;to_char()=;
注意事項:這是一個強制的符號對應位沒有則以o填充這是很大不同地方
在小數位則表示轉換為對應字符如果沒有則以表示;在整數位沒有對應則不填充字符
to_char()=; TO_CHAR()=;
注意事項:對於和而言如果格式的位數不如數字的位數多會返回#
譬如to_char()=#####
B(空格符) B 沒有其它特別作用在整數部分最前面加一個空格可以出現在任意位置
S||TO_CHAR(B)=S ;
注意事項:只能出現在整數部位
C(國際貨幣符號) C 在特定的位置返回一個ISO貨幣符號(就是NLS_ISO_CURRENCY參數所代表的值)
TO_CHAR(C)=CNY 這是新的國際標准RMB關於這個可查詢國際貨幣符號
注意事項:只能出現在整數部位第一位
可以通過alter session set NLS_ISO_CURRENCY=JAPAN;來修改當前會話的設置
D(ISO 小數位符號) D
這是點號的國際版本(ISO)作用等同於點號也是只能出現一次所不同的是數據庫會根據NLS_NUMERIC_CHARACTER的參數值來設置內容默認的這個值是點號
注意事項:沒有特別需要一般不要用這個格式符號也不要輕易修改參數值
也可用alter sesssion set 來修改
alter session set nls_numeric_characters=!; to_char(d)=!
EEEE(科學計算符) EEEE 科學計算符號
TO_CHAR(EEEE)=E+由於是科學計算方法所以小數位前面加一個或者即可多個是沒有意義的
G(分組符號) G 是逗號()的的ISO標准作為分組符號使用可以放在多個地方使用
TO_CHAR(GG)=
注意事項:同第八項 D 此外如果要轉換出小數點則要和D配合使用不能和點號配合
L(本地貨幣符號) L 是C的本地版本可以放在整個格式的最前面和最後面
TO_CHAR(GGDL)=¥
注意事項:同第七項 C
MI(負號) MI
如果是負數在尾部加上負號()如果是正數則尾巴加上空格
to_char(mi)||S||TO_CHAR(MI) = S
注意事項:只能放在格式尾巴
PR(符號) PR 是表達負數的另外一種方式如果是正數則頭部加上空格;如果是負數則用小簡括號<>把數字包起來
TO_CHAR(GDPR)=<>
注意事項:同
RN(rn) RN(rn) 把整數()轉換為羅馬字符RN表示轉為大寫rn表示小寫的
declare
i int;
begin
for i in loop
dbms_outputput_line(to_char(iRN));
end loop;
end;
注意事項:只能自己使用不能和其它符號組合使用
S S 是的綜合改進版本為整數加一個正號+為負數加一個符號S在前則加在前在後則在後
TO_CHAR(S)=;TO_CHAR(S)=+
TM TM/TMe
使用這個參數等於沒有用參數to_char(number)一樣應為tm是默認的格式參數
to_char(tme)=
注意事項:格式要麼是TM要麼是TME
當數字長度超過位時候TM的輸出等同於TME的輸出
U U 雙幣符號例如歐元作用同的L
TO_CHAR(U)=¥
注意事項通過NLS_DUAL_CURRENCY 控制
V V 這是個比較古怪又不是很常使用的符號它的作用在於做一個計算
例如TO_CHAR(NV)以p表示V的位置則該表達式=to_char(N×(的P次方))但是個數又必須保證大於等於乘積之後表示的位數
TO_CHAR(V)=*=;
TO_CHAR(V)=*=
TO_CHAR(V)=
TO_CHAR(V)=###### 的個數不夠
注意事項格式中不能和小數表達寫在一起但是可以混合貨幣等
X xxxx 轉換為進制
TO_CHAR(XX)=
注意事項數值必須是大於等於的整數前面只能和或者FM組合使用
通過以上的例子我們了解了各種數字的格式可以說格式太多樣難於記在腦子最好是作為一個參考存在著
歸類
數值類
分組類 ()()DG 其中點好和逗號因為表示不明顯所以用小括號凸顯
貨幣類 $CLU
計算轉換類EEEERNVX
正負符號MIPRS
其它類B
正統類TM
格式說明
從上圖可以看到格式是可選取的保留字fmt也不是必須的關鍵是NLSPARAM的意思
從第章節(FORMAT MODELS)查看
NLSPARAM可以是這樣 NLS_NUMERIC_CHARACTERS = dg NLS_CURRENCY = text NLS_ISO_CURRENCY = territory
舉例(待續)
SELECT TO_CHAR( CGDPR
NLS_NUMERIC_CHARACTERS=_ NLS_ISO_CURRENCY=UNITED KINGDOM) Amount
FROM DUAL;
結果返回<GBP_>
如果要了解可以使用的NLS_ISO_CURRENCY值可以查詢數據庫的視圖V_$NLS_VALID_VALUES
二 TO_CHAR(CHARACTER)
把NCLOBCLOBNCHAR轉換為VARCHAR
三 TO_CHAR(DATETIME)
把日期轉化為字符串
關於這個格式沒有什麼太好說的它的格式主要分為兩類簡寫單個字母(或者其復現形式)代表時間位置譬如yyyy mmdd hh之類;其次是以英文的時間單詞的簡寫代表時間例如mondayyear
下表的格式基本上也都可以用於TO_DATE TO_TIMESTAMP TO_TIMESTAMP_TZ TO_YMINTERVAL
TO_DSINTERVAL函數
序號
格式
簡例
說明
/ ; :
text 略 時間分隔符號除了標准的幾個還允許用文字作為分割符號
例如 to_char(sysdateYYYY年mm月dd日)=年月日
AD
AD 即拉丁文Anno Domini的簡寫表示公元會根據nls的不同轉換為公元或者ad等
無特殊注意事項
AM
AM 上午的簡寫 同pm pm (下午) 中文環境輸出為上午(如果是上午)
BC
BC 雖然標准的寫法是Bc (c小寫) 或者BC好在Oracle不講究這個表示公元前
CC
SCC 返回世紀以阿拉伯數字表示
如果年的後兩位介於那麼返回前兩位+否則返回前兩位
D 一周之中的某天返回的是序號
DAY 一周之中的某天不過返回的是星期幾而已這和語言設置有關系在中國環境 NLS_DATE_LANGUAGE=SIMPLIFIED CHINESE 用星期一到星期天表示
DD 月份中的某天()
DDD 年份中的某天()
DL DL 返回長的日期格式受到NLS_TERRITORYNLS_LANGUAGE參數控制例 年月日 星期一
限制除了DL其它什麼的都不能設置
DS 返回短的日期格式受到NLS_TERRITORYNLS_LANGUAGE參數控制 例如
限制除了DL其它什麼的都不能設置
DY 日期的簡稱就是星期幾(當然這指的是中國環境下)
E 紀元簡稱但是只適合以下集中日歷日本皇室中華民國太過佛歷
EE 紀元全程適合情況同E
FF [] 就是毫秒如果不更上數字就是用默認的精度
只能用於timestamp類型的
FM 值得注意的一個函數不返回任何內容
有點不明白oracle為什麼設置這個東西
FX 同上
HH 表示小時為小時制同hh()
HH 表示小時為小時制()
HH 表示小時為小時制()
IW ISO標准的星期序號(或者)
IYYY
IYY
IY
I
IYYIYI ISO年(位)的位數字(倒數)
to_char(to_date(yyyymmdd)iyyy iyyiyi)=
J 儒略日(多用於天文的一種日歷)從公元前年一月一日算起得出的結果是個整數算法大體為 (公元日期+)*儒略日歷年平均天數
MI 秒()
MM 位月()
MON 月的簡稱和國家有關系NLS_DATE_LANGUAGE例如在中文環境下用月表示
MONTH 月的名稱國家有關系NLS_DATE_LANGUAGE目前在中文下表示為月
PM
PM
同amam表示下午
Q 季度()
RM 用羅馬數字表示的月份I II III IV V VI VII VIIIIX X XI XII
RR 有點四捨五入表示年的意思具體的用法有那麼一點點復雜
以s表示輸入的年份最後兩位c表示當前的年份最後兩位其輸出結果(新的年份前兩位)可以用函數r=f(sc)來表示sc分別表示sc的前兩位
)s=[]c=[]則r=c
) s=[]c=[]則 r=c+
) s=[]c=[]則r=c
) s=[]c=[]則 r=c
簡而言之就是靠近當前年份原則如果和當前年份同區域那麼就一樣如果比當前區域大那麼就是當作是當前世紀前一世紀否則就是下一個世紀
舉例來說以to_date為例子
SQL> select to_date(rrmmdd) to_date(rrmmdd) FROM DUAL;
TO_DATE(RRMMDD) TO_DATE(RRMMDD)
我想oracle會搞這個東東出來估計有兩個考慮一個是為了方便一個是為了對付百年或者千年問題
RRRR 如果輸入參數只有兩位則同rr否則就同yyyy作用
SS 秒()一分鐘內
SSSSS 一天從午夜開始的累積秒數()
TS 返回短日期格式內容包括時分秒等只能和dlds組合使用格式是:
dl ts或者dl ts 中間以空格間隔開TO_CHAR(SYSDATETS)=下午 ::
表現形式受NLS_TERRITORY 和NLS_LANGUAGE影響
TZD 夏令時制信息時區簡寫加上夏令時信息必須和格式tzr設置的時區對應
包括下面三個TZ開頭的都是和時區相關並不是直接用在to_char
TZH 時區中的小時例如hh:mi:ssfftzh:tzm
TZM 時區中的分鐘
TZR 時區中的區域信息必須是數據庫支持的時區例如US/Pacific
WW 和iw類似也是表示星期的序號從年的第一天算起到年的最後一個第七天二者取值基本相同() 例如 到 算~ 算
W 一個月中的星期序號其算法同ww不過是局限在一月之內而已和iso的不同
X 代表本地根符號沒有特別用處只能和timestamp類型一起使用
YYYY 四位年用都好分隔 例如
YEAR
SYEAR 發音表達的年例如 =two thousand eight
S前綴表示公元前BC
YYYY
SYYYY 四位年S前綴表示公元前BC
YYY
YY
Y 一次表示後面位的年例如 可以分別取值為
總結 從以上看主要就是表示時間幾個部分的格式世紀年月日時分秒毫秒以及其它一些混合格式每個時間部分都可以有多種的表達方式通過這樣歸類就比較容易記憶
很多格式可以組合使用這樣最終可以形成足夠豐富的表達其形勢
其次很多格式和nls是密切相關的最後某些輸出(返回)和格式大小寫是有關系的這在中文環境下體現不出來(目前來沒有看到)但是english環境下就名下以to_char(sysdateday)為例子如果是西文環境是返回sun(假設sysdate位於周末)如果to_char(sysdateDAY)則返回SUN
使用前對一些不確定的先試驗一下最好實在不行就查閱oracle的原始文檔
由於可以采取非常多的格式所以實在是很靈活的下面簡單的舉例幾個
SQL> select to_char(sysdate PM yyyymmdd hh:mi:sssss AD year mon day ddd iw) FROM DUAL;
TO_CHAR(SYSDATEPMYYYYMMDDH
上午 :: 公元 two thousand eight 月 星期四
SQL> SELECT TO_CHAR(SYSTIMESTAMPHH:MI:SSFF) FROM DUAL;
TO_CHAR(SYSTIMESTAMPHH:MI:
::
SQL>SELECT TO_CHAR(SYSDATEDS DL) FROM DUAL
TO_CHAR(SYSDATEDSDL)
年月日 星期四
最後一個和國家地區有關
From:http://tw.wingwit.com/Article/program/Oracle/201311/18774.html