JDBC 日期精度丢失
在使用"两间瓦房"框架时遇见一个问题,在oracle数据库中插入date类型的数据,出现精度丢失问题,具体表现为:数据库中存储为"2012-06-14",而"HH:mm:ss"部分却不见了.跟踪源程序发现问题出在了如下代码上:
1 case java.sql.Types.TIMESTAMP: 2 java.util.Date d; 3 if (val.length() > 10) { 4 d = sf.parse(val); 5 } else { 6 d = sfs.parse(val); 7 } 8 long l = d.getTime(); 9 java.sql.Timestamp ts = new java.sql.Timestamp(l); 10 st.setTimestamp(iParam, ts); 11 break; 12case java.sql.Types.TIME: 13 if (val.length() > 10) { 14 d = sf.parse(val); 15 } else { 16 d = sfs.parse(val); 17 } 18 l = d.getTime(); 19 java.sql.Time stm = new java.sql.Time(l); 20 st.setTime(iParam, stm); 21 break; 22case java.sql.Types.DATE: 23 if (val.length() > 10) { 24 d = sf.parse(val); 25 } else { 26 d = sfs.parse(val); 27 } 28 l = d.getTime(); 29 java.sql.Date sd = new java.sql.Date(l); 30 st.setDate(iParam, sd); 37 break;
上述代码中 红色背景的代码,在转换时 只保留了日期(yyyy-MM-dd),而丢失了时间(HH:mm:ss)内容.这是导致精度丢失的罪魁祸首.
既然发现问题,我们就要解决问题,可以用timestamp类型 来取代date,可以参考上述蓝色背景的代码片段.
---------------------------------------------------------------------------------------------------------------------
下面根据上述问题来说一点理论知识:
java.sql 定义的时间类型包含三个类,date,time和timestamp.分别用来表示日期(无时间信息,eg: yyyy-mm-dd),时间(只处理时间,无日期部分, eg:hh:mm:ss)和时间戳(精确到纳秒级别)在它们都继承自java.util.date。