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

Oracle 日期轉換函數 TO_DATE 與 TO_CHAR 完整語法指南

     編輯:Oracle 資料庫基礎

核心雙雄:TO_DATE 與 TO_CHAR

Oracle 日期處理的核心在於兩個轉換函數的配合使用:

  • TO_DATE:字串 → 日期型別
  • TO_CHAR:日期 → 格式化字串

TO_DATE 詳細語法與用法

TO_DATE(string, format_mask [, nls_language])

基本範例

-- 日期轉換
TO_DATE('2004-11-27', 'YYYY-MM-DD')

-- 日期時間轉換
TO_DATE('2004-11-27 13:34:43', 'YYYY-MM-DD HH24:MI:SS')

-- 含毫秒
TO_DATE('2024-01-15 14:30:45.123', 'YYYY-MM-DD HH24:MI:SS.FF3')

關鍵原則:格式模式必須與字串內容完全對應

字串中的分隔符、長度、大小寫皆需與格式模式一致,否則拋出 ORA-01861 或 ORA-01843 錯誤。

完整日期格式元素對照表

格式元素含義範例輸出
YYYY四位數年份2024
YYY / YY / Y年份後三/二/一位024 / 24 / 4
MM兩位數月份 (01-12)01
MONTH完整月份名稱(右補空格至 9 字元)JANUARY
MON月份縮寫(三字元)JAN
WW年間第幾週 (1-53)03
D週內第幾天 (1-7,週日=1)2
DD月內第幾天 (01-31)15
DDD年間第幾天 (001-366)015
DAY完整星期名稱(右補空格至 9 字元)MONDAY
HH / HH1212 小時制小時 (01-12)02
HH2424 小時制小時 (00-23)14
MI分鐘 (00-59)30
SS秒 (00-59)45
SSSSS午夜至今總秒數 (0-86399)52245
FF / FF1..FF9小數秒(毫秒/微秒/奈秒).123456
AM / PM上午/下午標記PM

TO_CHAR 日期格式化輸出

TO_CHAR(date_value, format_mask [, nls_language])

常用格式化範例

-- 標準日期時間
SELECT TO_CHAR(SYSDATE, 'YYYY-MM-DD HH24:MI:SS') FROM dual;
-- 2024-01-15 14:30:45

-- 中文日期
SELECT TO_CHAR(SYSDATE, 'YYYY年MM月DD日', 'NLS_DATE_LANGUAGE=TRADITIONAL CHINESE') FROM dual;
-- 2024年01月15日

-- 週幾顯示
SELECT TO_CHAR(SYSDATE, 'DAY', 'NLS_DATE_LANGUAGE=TRADITIONAL CHINESE') FROM dual;
-- 星期一

-- 自訂格式
SELECT TO_CHAR(SYSDATE, 'YYYY/MM/DD HH24:MI') FROM dual;
-- 2024/01/15 14:30

進階應用與技巧

NLS 參數影響

預設日期語言由 NLS_DATE_LANGUAGE 或 NLS_TERRITORY 決定,可在 Session 層級覆蓋:

ALTER SESSION SET NLS_DATE_LANGUAGE = 'TRADITIONAL CHINESE';
ALTER SESSION SET NLS_DATE_FORMAT = 'YYYY-MM-DD HH24:MI:SS';

日期運算與轉換結合

-- 計算下個月第一天
SELECT TO_CHAR(ADD_MONTHS(TRUNC(SYSDATE, 'MM'), 1), 'YYYY-MM-DD') FROM dual;

-- 字串比較陷阱:勿直接比較日期字串
-- 錯誤:WHERE date_col > '2024-01-01'  -- 隱含轉換風險
-- 正確:WHERE date_col > TO_DATE('2024-01-01', 'YYYY-MM-DD')

處理多種輸入格式

-- 使用 CASE 或 COALESCE 處理不確定格式
SELECT TO_DATE(date_str, 
       CASE 
         WHEN REGEXP_LIKE(date_str, '^\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}$') THEN 'YYYY-MM-DD HH24:MI:SS'
         WHEN REGEXP_LIKE(date_str, '^\d{4}/\d{2}/\d{2}$') THEN 'YYYY/MM/DD'
         ELSE 'YYYY-MM-DD'
       END) 
FROM staging_table;

常見錯誤代碼與解決方案

錯誤代碼原因解決方案
ORA-01843非有效月份/日期數值檢查格式模式與資料是否對應,月份 01-12、日期 01-31
ORA-01861字面值與格式字串不匹配確認分隔符、長度、大小寫完全一致
ORA-01858非數值字符出現在數值位置資料含雜訊,需預清洗或用正則過濾
ORA-01830格式模式圖片過長格式字串超過限制,簡化模式

最佳實務總結

  1. 永遠顯式指定格式模式,不依賴隱含轉換
  2. 統一系統/Session 級 NLS 設定,減少格式模式重複撰寫
  3. 資料載入階段(ETL)完成轉換,業務層直接操作 DATE/TIMESTAMP 型別
  4. 使用 ANSI 日期字面值:DATE '2024-01-15'、TIMESTAMP '2024-01-15 14:30:45'
  5. 毫秒/微秒精度需求請使用 TIMESTAMP 型別與 FF 格式元素

總結

TO_DATE 與 TO_CHAR 是 Oracle 日期處理的基石。熟練掌握格式元素對照表、理解 NLS 參數影響、避開隱含轉換陷阱,是每位 Oracle 開發者的必修功課。建議建立專案級的日期格式規範文件,統一團隊開發標準。

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