在 Oracle 資料庫中,DATE 型別儲存的是二進位時間戳記,**本身不帶任何顯示格式**。使用者發現 INSERT 後查詢顯示為 05-3月-90,實際上是客戶端工具(如 SQL*Plus、SQL Developer、PL/SQL Developer)依據 NLS_DATE_FORMAT 參數自動格式化輸出所致。
NLS_DATE_FORMAT 可能為 DD-MON-RR(日-月縮寫-兩位年)。NLS_DATE_LANGUAGE,中文環境顯示「3月」,英文環境顯示「MAR」。RR 規則:50-99 視為 19xx,00-49 視為 20xx,故 90 代表 1990 年。yyyy-mm-dd 格式?核心原則:格式化只在「輸出/顯示」層進行,資料庫儲存層永遠不存格式。
TO_CHAR 明確指定(推薦)SELECT TO_CHAR(入職日期, 'YYYY-MM-DD') AS 格式化日期
FROM employees;
這是最安全、最明確的做法,不受 Session 參數影響。
NLS_DATE_FORMATALTER SESSION SET NLS_DATE_FORMAT = 'YYYY-MM-DD';
-- 後續 SELECT 入職日期 FROM employees; 直接顯示 1990-03-05
僅影響當前連線,適合開發/測試環境統一輸出格式。
ALTER SYSTEM SET NLS_DATE_FORMAT='YYYY-MM-DD' SCOPE=SPFILE; 需重啟實例。ALTER USER username SET NLS_DATE_FORMAT='YYYY-MM-DD';(12c+ 支援)。使用者原寫法 INSERT ... VALUES (TO_DATE('1990-03-05','YYYY-MM-DD')) 是正確的。**插入時必須用 TO_DATE 指定輸入字串格式**,否則 Oracle 會嘗試用預設 NLS_DATE_FORMAT 解析,極易出錯。
TO_DATE('字串', '明確格式') 或 DATE '1990-03-05' (ANSI 日期字面值)。TO_CHAR(欄位, '目標格式'),不要依賴隱性參數。掌握「儲存與顯示分離」原則,即可徹底解決 Oracle 日期格式困擾,確保跨環境、跨語系的資料一致性。