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

Oracle 日期時間插入完全指南:TO_DATE 格式模板、省略成分默認值、顯示格式化與 NLS 陷阱

     編輯:Oracle 教學

核心函數:TO_DATE(string, format_mask [, nls_params])

將字符串按指定格式轉換為 DATE 類型(含年月日時分秒,**無毫秒、無時區**,需用 TIMESTAMP)。

格式模板速查表

成分格式代碼示例輸入備註
年YYYY / RRRR2024 / 24RRRR 兩位年自動補全當前世紀
月MM / MON / MONTH01 / JAN / JANUARYMON/MONTH 依賴 NLS_DATE_LANGUAGE
日DD15
時 (24制)HH2413HH/HH12 需配合 AM/PM
分MI30
秒SS59
毫秒FF3123僅 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_FORMATDATE 隱式轉字符串顯示會話級設置 ALTER SESSION SET NLS_DATE_FORMAT='YYYY-MM-DD HH24:MI:SS'
NLS_TIMESTAMP_FORMATTIMESTAMP 顯示同上
NLS_DATE_LANGUAGE月份縮寫 (MON) 語言多語環境顯式指定 TO_DATE(..., 'NLS_DATE_LANGUAGE=AMERICAN')
NLS_TERRITORY周起始日、數字/日期默認格式應用啟動時統一設置

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/視圖/約束默認值。**

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved
錯誤寫法問題修正
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