Java - Oracle - 数据库插入 - 时间戳到日期列

时间:2011-08-26 07:40:43

标签: java date oracle10g prepared-statement

我有一个数据类型为DATE的表列。我通过Java PreparedStatement插入,如何在插入时存储时间戳?是否可以在DATE列中存储时间戳?

我试过

ps.setTimestamp(index, new java.sql.Timestamp(date.getTime()));

但没效果。

提前致谢。

4 个答案:

答案 0 :(得分:8)

Oracle中SQL类型和JDBC类型之间的映射有点复杂,特别是对于DATETIMESTAMP SQL类型。

Oracle数据库允许您在DATE列中存储时间戳信息,这与SQL标准中DATE的定义完全相反。在9.2引入TIMESTAMP列支持之前,Statement.setTimestamp适用于DATE列。从9.2开始,直到11.1,JDBC驱动程序将SQL DATE类型映射到JDBC Date,将SQL TIMESTAMP类型映射到JDBC Timestamp。使用10.2 JDBC驱动程序存储时间戳的可能解决方案列在Oracle JDBC FAQ中,并在此处转载:

  

在9.2到10.2中有几种方法可以解决这个问题   驱动程序:

     
      
  • 更改表格以使用TIMESTAMP而不是DATE。这可能是   很少可能,但它是最好的解决方案。

  •   
  • 更改应用程序以使用defineColumnType定义列   作为TIMESTAMP而不是DATE。这有问题,因为   你真的不想使用defineColumnType,除非你必须(见   什么是defineColumnType以及何时应该使用它? )。

  •   
  • 将应用程序改为使用getTimestamp而不是getObject。这个   在可能的情况下是一个很好的解决方案,但许多应用程   依赖于getObject的通用代码,因此并非总是可行。

  •   
  • 设置V8Compatible连接属性。这告诉JDBC驱动程序   使用旧映射而不是新映射。您可以设置此标志   作为连接属性或系统属性。你设置了   连接属性,将其添加到java.util.Properties对象   传递给DriverManager.getConnection或   OracleDataSource.setConnectionProperties。您设置系统属性   通过在java命令行中包含-D选项。

         

    java -Doracle.jdbc.V8Compatible =“true”MyApp

  •   

你也可以使用JDBC 11.1驱动程序(它们将对10g实例起作用),常见问题解答说明:

  

Oracle JDBC 11.1修复了此问题。从这个版本开始   默认情况下,驱动程序将SQL DATE列映射到java.sql.Timestamp。那里   无需设置V8Compatible即可获得正确的映射。   V8Compatible被强烈弃用。你根本不应该使用它。如果   你把它设置为真,它不会伤害任何东西,但你应该停下来   使用它。

答案 1 :(得分:1)

我建议 TIMESTAMP 类型,特别是当我们想要计算两个TIMESTAMP数据类型之间的时间差比DATE数据类型容易得多时。有关详细信息,请查看此post

答案 2 :(得分:0)

最后,发现在存储时,我们无能为力。选择时我们必须使用TO_CHAR。

由于

答案 3 :(得分:0)

只需在 SQL 语句中使用 to_date(?,'YYYY-MM-DD HH24:MI:SS') 并将日期格式化为字符串:

short s = atoi(array); // Implicit cast

如果需要,无论 OJDBC 驱动程序版本如何,它都可以工作。