javax.servlet.ServletException:java.sql.SQLDataException:ORA-01843:不是有效月份

时间:2018-04-12 10:11:12

标签: java oracle jsp

我尝试在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();

2 个答案:

答案 0 :(得分:1)

DD-mmm-YYYY更改为dd-MM-yyyy

答案 1 :(得分:1)

[TL; DR] 在预准备语句参数中使用正确的数据类型。

  • 如果列是DATETIMESTAMP数据类型,则使用ps.setTimestamp( int, java.sql.Timestamp )传递值。
  • 如果列为DATE且您希望时间组件始终为午夜,则使用ps.setDate( int, java.sql.Date )
  • 如果列是CHARVARCHAR2,则使用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 声明中。