首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

Oracle DATE 型別顯示格式問題:為何輸出變成「05-3月-90」及正確格式化方法

     編輯:程式設計綜合問答

在 Oracle 資料庫中,DATE 型別儲存的是二進位時間戳記,**本身不帶任何顯示格式**。使用者發現 INSERT 後查詢顯示為 05-3月-90,實際上是客戶端工具(如 SQL*Plus、SQL Developer、PL/SQL Developer)依據 NLS_DATE_FORMAT 參數自動格式化輸出所致。

為什麼會出現「05-3月-90」?

  • 預設 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 參數影響。

方法二:修改 Session 級 NLS_DATE_FORMAT

ALTER SESSION SET NLS_DATE_FORMAT = 'YYYY-MM-DD';
-- 後續 SELECT 入職日期 FROM employees; 直接顯示 1990-03-05

僅影響當前連線,適合開發/測試環境統一輸出格式。

方法三:修改系統/用戶級參數(需 DBA 權限,慎用)

  • 系統級: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 解析,極易出錯。

最佳實務總結

  1. 寫入:TO_DATE('字串', '明確格式') 或 DATE '1990-03-05' (ANSI 日期字面值)。
  2. 儲存:不存格式,只存二進位時間點。
  3. 讀出/顯示:永遠用 TO_CHAR(欄位, '目標格式'),不要依賴隱性參數。
  4. 應用層:Java/C# 等應用程式應在 ORM 或 DTO 層統一格式化,避免資料庫層耦合顯示邏輯。

掌握「儲存與顯示分離」原則,即可徹底解決 Oracle 日期格式困擾,確保跨環境、跨語系的資料一致性。

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