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。

原文地址:https://www.cnblogs.com/shihujiang/p/2548981.html