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

javax.servlet.ServletException:java.sql.SQLDataException:ORA-01843:不是有效月份,java,oracle,jsp,Java,Oracle,Jsp,我试图在Oracle数据库中插入一些值,但当我尝试在数据库中插入日期格式时,它给了我javax.servlet.ServletException:java.sql.SQLDataException:ORA-01843:不是一个有效的月份我在谷歌上搜索了它,但问题仍然没有解决这是我的代码,表列中的数据类型是日期 Date date2=new Date(); String strdateformat="hh:mm:ss"; DateFormat d

我试图在Oracle数据库中插入一些值,但当我尝试在数据库中插入日期格式时,它给了我javax.servlet.ServletException:java.sql.SQLDataException:ORA-01843:不是一个有效的月份我在谷歌上搜索了它,但问题仍然没有解决这是我的代码,表列中的数据类型是日期

    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();

DD-mmm-YYYY
更改为
DD-mmm-YYYY
在准备的语句参数中使用正确的数据类型

  • 如果列是
    DATE
    TIMESTAMP
    数据类型,则使用
    ps.setTimestamp(int,java.sql.TIMESTAMP)
    传递值
  • 如果列为
    DATE
    ,并且希望时间组件始终为午夜,则使用
    ps.setDate(int,java.sql.DATE)
  • 如果列是
    CHAR
    VARCHAR2
    ,则使用
    ps.setString(int,String)
    -不要将其用于日期/时间戳

为什么要将其转换为字符串,然后再转换回日期?只需在你准备好的声明中使用日期

此外,如果中的
TIME\u是日期或时间戳数据类型,则应将值作为
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(?,SYSTIMESTAMP,?,?,TRUNC( SYSDATE ),?)"
);

更新

TIME\u IN
是我写的这段代码的时间戳

Date date2=new Date();
String strdateformat="hh:mm:ss";
DateFormat dateformat=new SimpleDateFormat(strdateformat);
String formattime=dateformat.format(date2);
这就是为什么会发生错误(这也是在您提问时发布完整代码的一个很好的理由!)

您正在将
hh:mm:ss
字符串传递给
时间戳
列,Oracle将使用
NLS\u TIMESTAMP\u格式
会话参数(可能类似于
DD-MON-yyyyyy HH24:MI:ss.FF6
)隐式地尝试将字符串转换为
时间戳
)当它与该格式不匹配时,它将抛出一个异常

不要将其转换为字符串并返回-只需使用:

ps.setTimestamp( 2, java.sql.Timestamp.valueOf(java.time.LocalDateTime.now()) );

或者删除bind参数并使用

SYSTIMESTAMP

INSERT
语句中。

仍然面临java.sql.SQLDataException:ORA-01843:不是有效的月份错误调试
格式日期戳的值,并确保它符合oracle
到日期的时间戳和时间戳的标准,时间戳为空值TIME\u out=punch\u timespamp和WORKING\u HOUR=timeelpased,我更改了代码,但在这里仍然面临相同的错误我更改代码日期日期5=新日期();DateFormat sdf=新的SimpleDateFormat((“dd-mmm-YYYY”);字符串格式\u date\u punch=sdf.format(date5)@答案中没有任何东西可以将字符串转换为日期-您不应该得到该异常。请使用包含完整(相关)代码(即您使用的变量声明和输入值)的注释编辑您的问题以及完整的错误消息。@Aties已更新。其工作正常,但插入了时间此格式:12-APR-18 05.22.02.189000000 PM可以将日期插入为HH:MM:SS?@Aties No-a
时间戳
始终具有年、月、日、小时、分钟、秒和小数秒(并以20字节的形式存储,无任何格式)。如果只需要时间组件,则在查询列时,在select语句中使用
TO_CHAR(time_in,'HH24:MI:SS')
。列中
时间的数据类型是什么?作为
formattime
参数传递的是什么?TIME_IN是我写的这个代码的时间戳Date date2=new Date();字符串strdateformat=“hh:mm:ss”;DateFormat DateFormat=新的SimpleDateFormat(标准格式);字符串formattime=dateformat.format(date2);这就是你的错误所在。您正在将时间作为字符串以
hh:mm:ss
格式传递到
时间戳
,该时间戳预计为年、月、日以及小时、分钟和秒。@MT0:我之前更新了我的整个代码,工作正常,我将数据类型设置为varchar,但由于我将时间的数据类型更改为time\u in,time\u OUT为TIMESTAMP(6)以当地时区和打孔日期作为我结巴的日期
ps.setTimestamp( 2, new java.sql.Timestamp(System.currentTimeMillis()) );
SYSTIMESTAMP