首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> Oracle 資料庫 >> Oracle 資料庫基礎

Oracle TO_CHAR 函數完整指南:數值與日期格式化實戰技巧

     編輯:Oracle 資料庫基礎

Oracle TO_CHAR 函數概述

Oracle 的 TO_CHAR 函數是資料庫開發中最常用的轉換函數之一,主要功能是將數值型或日期型資料轉換為字串型。因其靈活的格式化能力,廣泛應用於報表產生、資料匯出、介面顯示等場景。本文將系統整理其用法,並分享實戰中常見的格式化技巧與避坑指南。

一、數值格式化的核心語法與範例

TO_CHAR 處理數值時的基本語法為:

TO_CHAR(n [, fmt [, 'nlsparam']])
  • n:要轉換的數值
  • fmt:格式模板,由格式元素組成
  • nlsparam:指定 NLS 參數,如小數點字元、群組分隔符、貨幣符號等

常用數值格式元素

元素說明
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'

關鍵技巧:FM 與 0/9 的組合

  • FM 前綴能移除格式化產生的前導空格與前導零,是解決「多出一個空格」問題的關鍵
  • 0 強制佔位,9 則只在有數字時顯示
  • 小數部分用 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'

三、NLS 參數與國際化支援

透過 nlsparam 可自訂區域設定,常用於多語系報表:

TO_CHAR(17145, 'L099G999', 
  'NLS_NUMERIC_CHARACTERS=".," NLS_CURRENCY="NUD"')
-- 結果:NUD017,145(以逗號為小數點,點號為千分位,貨幣符號為 NUD)
  • d:小數點字元
  • g:群組分隔符
  • NLS_CURRENCY:本地貨幣符號
  • NLS_ISO_CURRENCY:國際貨幣符號

四、實戰避坑指南與最佳實踐

1. 小數點前的零問題

直接 TO_CHAR(0.123) 會得到 .123,建議改用 TO_CHAR(0.123, '0.999') 強制顯示前導零。

2. 格式長度不足導致 #####

若格式模板位數不夠(如 TO_CHAR(100.12, '0.999')),Oracle 會回傳 ######。請確保整數部分格式位數足夠,或使用 FM9999999.0099 這類彈性格式。

3. 不想要四捨五入,只想截斷

TO_CHAR 固定會四捨五入。若需直接截斷,請先用 TRUNC 或 FLOOR 處理數值,再轉字串:

TO_CHAR(TRUNC(1.12345, 4), 'FM9999999.0099')  -- '1.1234'(直接截斷)

4. 整數顯示時多出小數點

TO_CHAR(100, 'FM90.0999') 會得到 100.。解決方法:

  • 用 CASE WHEN 判斷是否為整數,分別格式化
  • 或用 REGEXP_REPLACE(TO_CHAR(...), '\.$', '') 移除尾部小數點

5. 日期格式化的 FM 差異

Month 會右補空格至 9 字元,FMMonth 則不補。同理 DD 會補零,FMDD 不補。視 UI 需求選擇。

五、總結

TO_CHAR 是 Oracle 開發者的瑞士刀。掌握 FM、0/9 組合、NLS 參數 這三大核心,即可應對 90% 的格式化需求。記住:

  1. 數值格式化優先用 FM9999999.0099 類彈性模板
  2. 日期格式化善用 FM 移除多餘空格/零
  3. 跨語系環境務必指定 NLS_NUMERIC_CHARACTERS 避免小數點誤判
  4. 需截斷不四捨五入時,先 TRUNC 再 TO_CHAR

熟練運用這些技巧,能大幅減少前端處理邏輯,讓資料庫直接輸出符合顯示需求的字串。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved