Oracle 提供顯式轉換函式 TO_CHAR、TO_DATE、TO_NUMBER 讓開發者精確控制型態轉換,避免隱含轉換帶來的效能與正確性風險。本文系統整理語法、格式模型、常用範例與進階技巧。
| 函式 | 用途 | 語法 | 關鍵提醒 |
|---|---|---|---|
| TO_CHAR | 數值/日期 → 字串 | TO_CHAR(expr, fmt, nlsparam) | fmt 必須單引號包裹、區分大小寫 |
| TO_DATE | 字串 → 日期 | TO_DATE(char, fmt, nlsparam) | fmt 需與輸入字串完全對應 |
| TO_NUMBER | 字串 → 數值 | TO_NUMBER(char, fmt, nlsparam) | fmt 可指定千分位、貨幣符號 |
-- 年月日時分秒
TO_CHAR(SYSDATE, 'YYYY-MM-DD HH24:MI:SS') -- 2024-01-15 14:30:45
TO_CHAR(SYSDATE, 'YYYY-MM-DD HH12:MI:SS AM') -- 2024-01-15 02:30:45 PM
-- 進階格式
TO_CHAR(SYSDATE, 'DD "of" MONTH') -- 15 of JANUARY
TO_CHAR(SYSDATE, 'YYYY "Year" Q "Quarter"') -- 2024 Year 1 Quarter
TO_CHAR(SYSDATE, 'IW') -- ISO 週數 (1-53)
TO_CHAR(SYSDATE, 'CC') -- 世紀 (21)
TO_CHAR(12345.67, '999,999.99') -- 12,345.67
TO_CHAR(12345.67, '000,000.00') -- 012,345.67 (前導零)
TO_CHAR(-12345.67, '999,999.99MI') -- 12,345.67- (負號後置)
TO_CHAR(-12345.67, '999,999.99PR') -- <12,345.67> (括號表示負)
TO_CHAR(12345.67, 'L999,999.99') -- $12,345.67 (本地貨幣符號)
TO_CHAR(0.123, '0.999') -- 0.123 (強制顯示小數點前 0)
TO_CHAR(100.12, 'FM999.999') -- 100.12 (FM 移除前導/尾隨空白)
SELECT employee_id,
TO_CHAR(hire_date, 'YYYY-MM') AS hire_ym,
TO_CHAR(salary, 'L999,999.99') AS salary_fmt
FROM employees
WHERE last_name = 'Higgins';
-- 來源字串 '20240115143045' 轉 DATE
TO_DATE(substr(src_col,1,14), 'YYYYMMDDHH24MISS')
-- 來源金額字串 '1,234.56' 轉 NUMBER
TO_NUMBER(src_amt, '999,999.99', 'NLS_NUMERIC_CHARACTERS=''.,''')
CREATE OR REPLACE FUNCTION fmt_amount(p_amt NUMBER, p_fmt VARCHAR2) RETURN VARCHAR2 IS
BEGIN
RETURN TO_CHAR(p_amt, p_fmt);
EXCEPTION
WHEN OTHERS THEN RETURN TO_CHAR(p_amt); -- 失敗回退預設
END;
FM 移除前導空白與尾隨零,但整數值仍會保留小數點(如 TO_CHAR(100, 'FM999.99') → '100.'),需自行 RTRIM(..., '.') 處理。TO_CHAR(1.999, '9.99') → '2.00'(四捨五入),若需截斷請先 TRUNC(val, 2) 再格式化。nlsparam > Session NLS_* > Database NLS_* > 預設值。熟練掌握三大轉換函式與格式模型,能讓 SQL 更精準、報表更美觀、跨系統整合更穩健。