Oracle 的 TO_CHAR 函數是資料庫開發中最常用的轉換函數之一,主要功能是將數值型或日期型資料轉換為字串型。因其靈活的格式化能力,廣泛應用於報表產生、資料匯出、介面顯示等場景。本文將系統整理其用法,並分享實戰中常見的格式化技巧與避坑指南。
TO_CHAR 處理數值時的基本語法為:
TO_CHAR(n [, fmt [, 'nlsparam']])
| 元素 | 說明 |
|---|---|
| 9 | 顯示數字,前導零不顯示 |
| 0 | 顯示數字,前導零會顯示 |
| , | 群組分隔符(千分位) |
| . | 小數點 |
| $ | 本地貨幣符號 |
| FM | 移除前後空格與前導零(Format Mode) |
-- 基本轉換
TO_CHAR(1210.73, '9999.9') -- '1210.7'
TO_CHAR(1210.73, '9,999.99') -- '1,210.73'
TO_CHAR(1210.73, '$9,999.00') -- '$1,210.73'
TO_CHAR(21, '000099') -- '000021'
-- 解決 0.123 顯示為 .123 的問題
TO_CHAR(0.123, '0.999') -- '0.123'
-- 進階需求:去空格、小數點最多 4 位、最少 2 位、四捨五入
TO_CHAR(123.0233, 'FM9999999.0099') -- '123.0233'
TO_CHAR(1.12345, 'FM9999999.0099') -- '1.1235'(四捨五入)
TO_CHAR(1, 'FM9999999.0099') -- '1.00'
0099 表示:前兩位必顯示(不足補零),後兩位僅在有值時顯示,且第五位會四捨五入日期轉字串同樣使用 TO_CHAR(date, fmt),支援豐富的格式元素,可自由組合:
YEAR -- 年份拼寫(如 TWENTY TWENTY-FOUR)
YYYY -- 4 位數年份
YYY/YY/Y -- 後 3/2/1 位年份
IYYY/IYY/IY/I -- ISO 標準年份
Q -- 季度 (1-4)
MM -- 月份 (01-12)
MON -- 月份縮寫 (JAN, FEB...)
MONTH -- 月份全名,右補空格至 9 字元
RM -- 羅馬數字月份 (I-XII)
WW -- 年內第幾週 (1-53),以 1/1 起算
W -- 月內第幾週 (1-5)
IW -- ISO 週數 (1-52/53)
D -- 週內第幾天 (1-7)
DAY -- 星期全名
DD -- 月內第幾天 (1-31)
DDD -- 年內第幾天 (1-366)
DY -- 星期縮寫
J -- 儒略日
HH/HH12 -- 12 小時制 (1-12)
HH24 -- 24 小時制 (0-23)
MI -- 分鐘 (0-59)
SS -- 秒 (0-59)
SSSSS -- 午夜過後秒數 (0-86399)
FF -- 小數秒
TO_CHAR(SYSDATE, 'YYYY/MM/DD') -- '2024/07/09'
TO_CHAR(SYSDATE, 'Month DD, YYYY') -- 'July 09, 2024'(含前導空格)
TO_CHAR(SYSDATE, 'FMMonth DD, YYYY') -- 'July 9, 2024'(FM 移除空格)
TO_CHAR(SYSDATE, 'MON DDth, YYYY') -- 'JUL 09TH, 2024'
TO_CHAR(SYSDATE, 'FMMON DDth, YYYY') -- 'JUL 9TH, 2024'
TO_CHAR(SYSDATE, 'FMMon ddth, YYYY') -- 'Jul 9th, 2024'
透過 nlsparam 可自訂區域設定,常用於多語系報表:
TO_CHAR(17145, 'L099G999',
'NLS_NUMERIC_CHARACTERS=".," NLS_CURRENCY="NUD"')
-- 結果:NUD017,145(以逗號為小數點,點號為千分位,貨幣符號為 NUD)
d:小數點字元g:群組分隔符NLS_CURRENCY:本地貨幣符號NLS_ISO_CURRENCY:國際貨幣符號直接 TO_CHAR(0.123) 會得到 .123,建議改用 TO_CHAR(0.123, '0.999') 強制顯示前導零。
若格式模板位數不夠(如 TO_CHAR(100.12, '0.999')),Oracle 會回傳 ######。請確保整數部分格式位數足夠,或使用 FM9999999.0099 這類彈性格式。
TO_CHAR 固定會四捨五入。若需直接截斷,請先用 TRUNC 或 FLOOR 處理數值,再轉字串:
TO_CHAR(TRUNC(1.12345, 4), 'FM9999999.0099') -- '1.1234'(直接截斷)
TO_CHAR(100, 'FM90.0999') 會得到 100.。解決方法:
CASE WHEN 判斷是否為整數,分別格式化REGEXP_REPLACE(TO_CHAR(...), '\.$', '') 移除尾部小數點Month 會右補空格至 9 字元,FMMonth 則不補。同理 DD 會補零,FMDD 不補。視 UI 需求選擇。
TO_CHAR 是 Oracle 開發者的瑞士刀。掌握 FM、0/9 組合、NLS 參數 這三大核心,即可應對 90% 的格式化需求。記住:
FM9999999.0099 類彈性模板FM 移除多餘空格/零NLS_NUMERIC_CHARACTERS 避免小數點誤判TRUNC 再 TO_CHAR熟練運用這些技巧,能大幅減少前端處理邏輯,讓資料庫直接輸出符合顯示需求的字串。