我正在尝试将日期保存到我的oracle数据库。
long startTime = System.nanoTime();
java.sql.Date startTimeDisplay = new Date(startTime);
PreparedStatement st;
String sql = "INSERT INTO J0T_JOB_STATUS (JST_JOB_ID, JST_JOB_CONFIGURATION_ID, JST_STATUS_CD, JST_START_TM, JST_END_TM, JST_CURR_STEP, JST_STEP_DETAILS, JST_MSG_COLLECTION) "
+ "VALUES(?, ?, ?, ?, ?, ?, ?, ?)";
st.setDate(4, startTimeDisplay);
这在我们的JUnit测试套件中运行得很好,它使用HSQL而不是oracle,但是当使用oracle时我得到:
[err] Exception in thread "Thread-15"
[err] java.lang.IllegalArgumentException: Invalid year value
[err] at oracle.sql.TIMESTAMP.getOracleYear(TIMESTAMP.java:772)
[err] at oracle.sql.DATE.toBytes(DATE.java:533)
[err] at oracle.sql.DATE.<init>(DATE.java:121)
[err] at oracle.jdbc.driver.OraclePreparedStatement.setDate(OraclePreparedStatement.java:8747)
[err] at oracle.jdbc.driver.OraclePreparedStatementWrapper.setDate(OraclePreparedStatementWrapper.java:177)
[err] at com.ibm.ws.rsadapter.jdbc.WSJdbcPreparedStatement.setDate(WSJdbcPreparedStatement.java:1333)
etc.
表格定义:
desc J0T_JOB_STATUS
Name Null Type
------------------------ ---- ------------
JST_JOB_ID VARCHAR2(50)
JST_JOB_CONFIGURATION_ID NUMBER
JST_STATUS_CD VARCHAR2(30)
JST_START_TM TIMESTAMP(6)
JST_END_TM TIMESTAMP(6)
JST_CURR_STEP NUMBER
JST_STEP_DETAILS CLOB
JST_MSG_COLLECTION CLOB
答案 0 :(得分:2)
根据Java Docs关于System.nanoTime()
(我假设Java7,因为你没有提供你的java版本):
此方法只能用于测量经过的时间而不是 与系统或挂钟时间的任何其他概念有关。价值 返回表示自某些固定但任意来源以来的纳秒 时间(也许在未来,所以价值可能是负面的)
链接:https://docs.oracle.com/javase/7/docs/api/java/lang/System.html#nanoTime()
我建议改为使用System.currentTimeMillis()
,除非你想最终保持负数。