TO_CHAR(dt, 'YYYY-MM-DD HH24:MI') → 2014-12-10 16:12 正常。ResultSet.getString() 取得 2014-12-10 16 (分號丟失) 或 16? (亂碼)。HH24-MI → Java 端正常顯示 16-12。ojdbc14/ojdbc5/ojdbc6 在解析 DATE/TIMESTAMP 字串時,將冒號視為參數標記或時區分隔符,導致截斷。NLS_DATE_FORMAT 不含分秒,驅動可能按該格式重新格式化後再傳回。使用 ojdbc8.jar (JDK 8+) 或 ojdbc11.jar (JDK 11+),從 Oracle 官網下載,替換專案/classpath 中舊版驅動。新版驅動正確處理冒號與時區。
SELECT TO_CHAR(dt, 'YYYY-MM-DD HH24:MI') AS dt_str FROM ...
在 Java 端用 rs.getString("dt_str") 取得純字串,繞過 DATE 類型解析邏輯。
ALTER SESSION SET NLS_DATE_FORMAT = 'YYYY-MM-DD HH24:MI:SS';
ALTER SESSION SET NLS_TIMESTAMP_FORMAT = 'YYYY-MM-DD HH24:MI:SS.FF';
或在連線 URL 加入:jdbc:oracle:thin:@host:port:sid?oracle.net.nls_date_format=YYYY-MM-DD HH24:MI:SS
LocalDateTime ldt = rs.getObject("dt_col", LocalDateTime.class);
String formatted = ldt.format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm"));
需驅動支援 getObject(int, Class) 且資料庫欄位為 TIMESTAMP。
TIMESTAMP WITH TIME ZONE**,應用層統一用 Instant/ZonedDateTime 處理時區。SELECT * 導致驅動隱式轉換。