首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 相關知識

Java 呼叫存儲過程傳遞 Date 參數陷阱:setDate vs setTimestamp

     編輯:Java 相關知識

問題現象

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.DateDATE日期 (無時間)純日期欄位
java.sql.TimeTIME時間 (無日期)純時間欄位
java.sql.TimestampTIMESTAMP / 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。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved