我尝试在Oracle数据库中插入一些值,但是当我尝试在数据库中插入日期格式时,它给我ja vax.servlet.ServletException:java.sql.SQLDataException:ORA-01843:不是有效月份< / strong>我google它但仍然问题不解决这里是我的代码,在表列数据类型是DATE
Date date2=new Date();
String strdateformat="hh:mm:ss";
DateFormat dateformat=new SimpleDateFormat(strdateformat);
String formattime=dateformat.format(date2);
Date date5=new Date();
SimpleDateFormat mysimpledateformat=new SimpleDateFormat("dd-mmm-yyyy");
String mydatestring=mysimpledateformat.format(date5);
String TIME_OUT_HISTORY="";
punch_out_timespamp=null;
timeelpased=null;
PreparedStatement ps=con1.prepareStatement("insert into EMPLOYEE_LOGIN_TIME(EMPLOYEE_ID,TIME_IN,TIME_OUT,WORKING_HOUR,PUNCH_DATE,TIME_OUT_HISTORY) values(?,?,?,?,?,?)");
ps.setString(1, Employee_id);
ps.setString(2,formattime);
ps.setTimestamp(3, punch_out_timespamp);
ps.setObject(4, timeelpased);
ps.setString(5,mydatestring);
ps.setString(6,TIME_OUT_HISTORY);
ps.executeUpdate();
答案 0 :(得分:1)
将DD-mmm-YYYY
更改为dd-MM-yyyy
答案 1 :(得分:1)
[TL; DR] 在预准备语句参数中使用正确的数据类型。
DATE
或TIMESTAMP
数据类型,则使用ps.setTimestamp( int, java.sql.Timestamp )
传递值。DATE
且您希望时间组件始终为午夜,则使用ps.setDate( int, java.sql.Date )
。CHAR
或VARCHAR2
,则使用ps.setString( int, String )
- 请勿将其用于日期/时间戳。为什么要将它转换为字符串然后再转换为日期?只需在准备好的陈述中使用日期。
此外,如果TIME_IN
是日期或时间戳数据类型,那么您应该将值作为java.sql.Timestamp
值传递而不是字符串(并依赖Oracle隐式转换值 - 这可能是什么是失败的。)
PreparedStatement ps=con1.prepareStatement(
"insert into EMPLOYEE_LOGIN_TIME("
+ "EMPLOYEE_ID, TIME_IN, TIME_OUT, WORKING_HOUR, PUNCH_DATE, TIME_OUT_HISTORY"
+ ") values(?,?,?,?,?,?)"
);
ps.setString( 1, Employee_id );
// ps.setString( 2, formattime );
ps.setTimestamp( 2, new java.sql.Timestamp( System.currentTimeMillis() ) );
ps.setTimestamp( 3, punch_out_timespamp ); // Should this be punch_out_timestamp?
ps.setObject( 4, timeelpased ); // Should this be timeelapsed?
ps.setDate( 5, new java.sql.Date(System.currentTimeMillis()) );
// Java 8
// ps.setDate( 5, java.sql.Date.valueOf(java.time.LocalDate.now()));
ps.setString( 6, TIME_OUT_HISTORY );
ps.executeUpdate();
或者甚至 - 不要将它作为参数传递给查询:
PreparedStatement ps=con1.prepareStatement(
"insert into EMPLOYEE_LOGIN_TIME("
+ "EMPLOYEE_ID, TIME_IN, TIME_OUT, WORKING_HOUR, PUNCH_DATE, TIME_OUT_HISTORY"
+ ") values(?,SYSTIMESTAMP,?,?,TRUNC( SYSDATE ),?)"
);
<强>更新强>:
TIME_IN
是我编写此代码的时间戳Date date2=new Date(); String strdateformat="hh:mm:ss"; DateFormat dateformat=new SimpleDateFormat(strdateformat); String formattime=dateformat.format(date2);
这就是您的错误发生的原因(并且在您提出问题时发布完整代码的充分理由!)。
您正在将hh:mm:ss
字符串传递给TIMESTAMP
列,Oracle会隐式尝试使用TIMESTAMP
会话参数将字符串转换为NLS_TIMESTAMP_FORMAT
(可能是<{1}}之类的东西,当它与那种格式不匹配时,它会引发异常。
不要将其转换为字符串并返回 - 只需使用:
DD-MON-YYYY HH24:MI:SS.FF6
或
ps.setTimestamp( 2, java.sql.Timestamp.valueOf(java.time.LocalDateTime.now()) );
或删除bind参数并使用
ps.setTimestamp( 2, new java.sql.Timestamp(System.currentTimeMillis()) );
在SYSTIMESTAMP
声明中。