zoukankan      html  css  js  c++  java
  • 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。

  • 相关阅读:
    Effective C++学习笔记:确定基类有虚析构函数
    WPF和Silverlight程序中DispatcherTimer与Timer的区别
    2011.12.23
    WP7里的JSON解析
    2011.11.16
    2011.12.21
    2011.11.18
    2011.11.17
    2011.11.24
    WebClient does not support concurrent I/O operations 错误的解决办法
  • 原文地址:https://www.cnblogs.com/shihujiang/p/2548981.html
Copyright © 2011-2022 走看看