我有一个数据类型为DATE的表列。我通过Java PreparedStatement插入,如何在插入时存储时间戳?是否可以在DATE列中存储时间戳?
我试过
ps.setTimestamp(index, new java.sql.Timestamp(date.getTime()));
但没效果。
提前致谢。
答案 0 :(得分:8)
Oracle中SQL类型和JDBC类型之间的映射有点复杂,特别是对于DATE
和TIMESTAMP
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)
由于
答案 3 :(得分:0)
只需在 SQL 语句中使用 to_date(?,'YYYY-MM-DD HH24:MI:SS') 并将日期格式化为字符串:
short s = atoi(array); // Implicit cast
如果需要,无论 OJDBC 驱动程序版本如何,它都可以工作。