Sybase 存儲過程參數為 datetime,Java 用 cs.setDate(3, new java.sql.Date(ts.getTime())) 傳遞,結果集為空;改用 cs.setString 傳字串則正常。
java.sql.Date **僅保留日期部分 (年月日),時分秒被截斷**。資料庫 datetime 欄位含時間,比較失敗。
// 錯誤
cs.setDate(3, new java.sql.Date(kssj.getTime()));
// 正確:使用 java.sql.Timestamp 保留完整時間精度
cs.setTimestamp(3, new java.sql.Timestamp(kssj.getTime()));
cs.setTimestamp(4, new java.sql.Timestamp(jssj.getTime()));
| Java 型別 | 對應 JDBC 型別 | 精度 | 適用場景 |
|---|---|---|---|
| java.sql.Date | DATE | 日期 (無時間) | 純日期欄位 |
| java.sql.Time | TIME | 時間 (無日期) | 純時間欄位 |
| java.sql.Timestamp | TIMESTAMP / DATETIME | 日期+時間+納秒 | datetime、timestamp 欄位 |
| java.time.LocalDateTime (JDBC 4.2+) | TIMESTAMP | 日期+時間 | 現代 API,推薦 |
DATETIME/TIMESTAMP 時,必須用 setTimestamp 或 setObject(..., JavaTime.LocalDateTime)。setString 繞過型別系統,導致隱式轉換、索引失效、注入風險。java.time 套件 (JDK 8+),DAO 層轉換為 Timestamp 傳給 JDBC。