JDBC PreparedStatement 設定日期時間欄位時,需區分 java.sql.Date (僅日期)、java.sql.Time (僅時間)、java.sql.Timestamp (日期時間) 三種型別,並正確轉換自 java.util.Date 或字串。
// 1. 字串解析為 java.util.Date
SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd"); // 注意: MM=月, mm=分
java.util.Date utilDate = sdf.parse("20240115");
// 2. 轉換為 java.sql.Date (僅保留日期部分)
java.sql.Date sqlDate = new java.sql.Date(utilDate.getTime());
// 3. 寫入資料庫
preparedStatement.setDate(1, sqlDate);
SimpleDateFormat("yyyymmdd"):mm 代表分鐘,會導致月份固定為 01。正確為 MM。utilDate.getTime() 回傳 long,不可直接指派給 java.sql.Date 變數,需用建構子 new java.sql.Date(time)。| 資料庫型別 | JDBC 型別 | Setter 方法 | 適用場景 |
|---|---|---|---|
| DATE | java.sql.Date | setDate() | 生日、生效日 |
| TIME | java.sql.Time | setTime() | 上班打卡時間 |
| TIMESTAMP / DATETIME | java.sql.Timestamp | setTimestamp() | 建立時間、異動時間 |
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
java.util.Date utilDate = sdf.parse("2024-01-15 14:30:00");
java.sql.Timestamp ts = new java.sql.Timestamp(utilDate.getTime());
ps.setTimestamp(1, ts);
// 1. java.util.Date
java.util.Date now = new java.util.Date();
// 2. 格式化輸出 yyyyMMdd
SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd");
String todayStr = sdf.format(now);
// 3. 分別取得 年/月/日
SimpleDateFormat sy = new SimpleDateFormat("yyyy");
SimpleDateFormat sm = new SimpleDateFormat("MM");
SimpleDateFormat sd = new SimpleDateFormat("dd");
String year = sy.format(now); // 2024
String month = sm.format(now); // 01
String day = sd.format(now); // 15
TIMESTAMP WITH TIME ZONE (或 DATETIMEOFFSET) 儲存 UTC 時間,應用層轉換時區。java.time.LocalDateTime、Instant、DateTimeFormatter,並搭配 JDBC 4.2+ 的 setObject 直接綁定。