以下是我尝试过的环境
Oracle DB版本:10.2.0.3.0
JDBC JAR版本:10g版本(10.2.0.5),(10.2.0.4),(10.2.0.3),(10.2.0.2),(10.2.0.1.0)驱动程序
Java版本:SE 1.4,SE 1.5,SE 6
当我使用JDBC测试一个简单的SQL插入到Oracle Date类型列时,发现了一个奇怪的错误。每当我使用PreparedStatement
并将java.sql.Timestamp
设置为从1970年到1981年的23:30:00到23:59:59之间的时间(任何月份和日期都可以),{{1插入数据库的值将被破坏。但是,如果我运行直接插入SQL,它就可以工作。
方案A不起作用。
Date
情景B有效。
Calendar c = Calendar.getInstance();
String sql = "INSERT INTO LABOR (LABORNAME, STARTTIME) VALUES (?, ?)";
c.set(1970, 1, 1, 23, 45);
pstmt = con.prepareStatement(sql);
pstmt.setString(1, "test");
pstmt.setTimestamp(2, new java.sql.Timestamp(c.getTimeInMillis()));
// Tried using new java.sql.Timestamp(utilDate.getTime()), result is the same
pstmt.execute();
已编辑**场景C,适用于JDBC 10g jar。感谢Mick Mnemonic的评论。
String sql = "INSERT INTO LABOR (LABORNAME, STARTTIME) VALUES ('TEST', TO_DATE('1970-01-01 23:55:00', 'YYYY-MM-DD HH24:MI:SS'))";
con = getConnection();
pstmt = con.prepareStatement(sql);
pstmt.execute();
对于场景A,如果我使用的是Oracle JDBC jar版本11g,则无法重现相同的错误。我的问题是实际导致问题的原因。
PS:我通过网络搜索,找不到任何相关内容。