天天看点

oracle10g获取Date类型字段无时分秒解决办法!

一般的数据库中,date字段仅仅表示日期,不包括日期信息,而oracle数据库中的date数据类型是包括日期、时间的,对于不同的oracle jdbc驱动版本,对于该问题的处理都有些区别。

最近使用 oracle 10g,时间字段因需求,设为了date类型,发现hibernate用native sql 查询或ibatis获取result.getobject()的时候显示不了时分秒,原来是jdbc驱动自动把date映射为 java.sql.date,故截断了时分秒信息,如果你使用9i或者11g 的驱动程序,就没有该问题,但是oracle10g的jdbc驱动,你会发现没有时分秒

,在oracle9.2之后,引入了内置数据类型timestamp。之所以引入它,是因为内置数据类型date的最小单位为秒;date的主要问题是它粒度不能足够区别出两个事件哪个先发生。9.2版本后oracle在date数据类型上扩展出来了timestamp数据类型,它包括了所有date数据类型的年月日时分秒的信息,而且包括了小数秒(纳秒nanoseconds级的)的信息。如果你想把date类型转换成timestamp类型,就使用cast函数。 也正是从oracle 9.2开始,内置数据类型date和timestamp在使用9i的jdbc驱动做查询时,date被映射为java.sql.date,timestamp被映射为java.sql.timestamp。 从oracle11开始,其jdbc驱动程序又重新开始回归为将内置类型date映射为java.sql.timestamp(正如9.2之前的那样)。 

所以,时分秒精度的丢失与hibernate无关,是oracle jdbc驱动的问题。最好的解决办法就是:

【1】换驱动。经测试,将最开始使用的10g的驱动ojdbc14.jar换为11g的驱动ojdbc5.jar后;

1.1:分别换应用web-info/lib目录下和build path引用。

1.2:如果是部署服务器应用还应当把was的配置改成ojdbc5.jar,具体截图如下:

oracle10g获取Date类型字段无时分秒解决办法!
oracle10g获取Date类型字段无时分秒解决办法!

ps:${oracle_jdbc_driver_path}路径指向在was-环境-websphere变量处可以看到具体服务器配置路径;

【2】数据库中把

date 设为 timestamp 类型。