核心函數:TO_DATE(string, format_mask [, nls_params])
將字符串按指定格式轉換為 DATE 類型(含年月日時分秒,**無毫秒、無時區**,需用 TIMESTAMP)。
格式模板速查表
| 成分 | 格式代碼 | 示例輸入 | 備註 |
| 年 | YYYY / RRRR | 2024 / 24 | RRRR 兩位年自動補全當前世紀 |
| 月 | MM / MON / MONTH | 01 / JAN / JANUARY | MON/MONTH 依賴 NLS_DATE_LANGUAGE |
| 日 | DD | 15 | |
| 時 (24制) | HH24 | 13 | HH/HH12 需配合 AM/PM |
| 分 | MI | 30 | |
| 秒 | SS | 59 | |
| 毫秒 | FF3 | 123 | 僅 TIMESTAMP 支持 |
| 時區 | TZH:TZM | +08:00 | 僅 TIMESTAMP WITH TIME ZONE |
省略成分的默認值規則(關鍵!)
Oracle **不報錯**,按以下默認值補全:
- 時/分/秒 → 00(即 00:00:00,午夜)。
- 日 → 1(月首日)。
- 月 → 1(1 月)。
實戰演示:同一張表插入不同精度字符串
CREATE TABLE t_dt (dt DATE);
INSERT INTO t_dt VALUES (TO_DATE('2024-12-25 14:30:45', 'YYYY-MM-DD HH24:MI:SS'));
INSERT INTO t_dt VALUES (TO_DATE('2024-12-25 14:30', 'YYYY-MM-DD HH24:MI'));
INSERT INTO t_dt VALUES (TO_DATE('2024-12-25 14', 'YYYY-MM-DD HH24'));
INSERT INTO t_dt VALUES (TO_DATE('2024-12-25', 'YYYY-MM-DD'));
INSERT INTO t_dt VALUES (TO_DATE('2024-12', 'YYYY-MM'));
INSERT INTO t_dt VALUES (TO_DATE('2024', 'YYYY'));
-- 查詢統一格式化顯示
SELECT TO_CHAR(dt, 'YYYY-MM-DD HH24:MI:SS') FROM t_dt;
-- 結果:
-- 2024-12-25 14:30:45
-- 2024-12-25 14:30:00
-- 2024-12-25 14:00:00
-- 2024-12-25 00:00:00
-- 2024-12-01 00:00:00
-- 2024-01-01 00:00:00
顯示陷阱:SELECT * vs TO_CHAR
SELECT * FROM t_dt → 客戶端工具按 **NLS_DATE_FORMAT** 顯示(默認 DD-MON-RR,如 25-DEC-24),**不顯示時間成分**!
SELECT TO_CHAR(dt, 'YYYY-MM-DD HH24:MI:SS') FROM t_dt → 見真章。
- **最佳實踐**:應用層/報表**永遠顯式 TO_CHAR**,不依賴 NLS 設置。
NLS 參數影響矩陣
| 參數 | 影響範圍 | 建議 |
| NLS_DATE_FORMAT | DATE 隱式轉字符串顯示 | 會話級設置 ALTER SESSION SET NLS_DATE_FORMAT='YYYY-MM-DD HH24:MI:SS' |
| NLS_TIMESTAMP_FORMAT | TIMESTAMP 顯示 | 同上 |
| NLS_DATE_LANGUAGE | 月份縮寫 (MON) 語言 | 多語環境顯式指定 TO_DATE(..., 'NLS_DATE_LANGUAGE=AMERICAN') |
| NLS_TERRITORY | 周起始日、數字/日期默認格式 | 應用啟動時統一設置 |
高頻錯誤與修正
| 錯誤寫法 | 問題 | 修正 |
TO_DATE('2024/12/25', 'YYYY-MM-DD') | 分隔符不匹配 | 格式掩碼與字符串完全一致 |
TO_DATE('2024-13-01', 'YYYY-MM-DD') | 月份越界 | 業務層校驗 |
INSERT INTO t VALUES ('2024-12-25') | 隱式轉換依賴 NLS | 顯式 TO_DATE 或 DATE '2024-12-25' (ANSI 字面量) |
TO_DATE(sysdate, 'YYYY-MM-DD') | 第一參數已是 DATE | 直接用 TRUNC(sysdate) 或 SYSDATE |
ANSI 日期字面量:最安全的跨環境寫法
DATE '2024-12-25' -- 日期
TIMESTAMP '2024-12-25 14:30:45.123' -- 時間戳
TIMESTAMP WITH TIME ZONE '2024-12-25 14:30:45+08:00' -- 帶時區
**無格式掩碼、無 NLS 依賴、標準 SQL、強烈推薦用於靜態 SQL/視圖/約束默認值。**
- 上一篇文章: Oracle 觸發器實現自增列:跨數據庫遷移兼容的標準化模板與 12c Identity 列現代替代方案
- 下一篇文章: Oracle 觸發器實戰兩大經典案例:薪資約束守護與刪除審計歸檔
Copyright ©
程式碼之家 All Rights Reserved