javax.servlet.ServletException:java.sql.SQLDataException:ORA-01843:不是有效月份
我试图在Oracle数据库中插入一些值,但当我尝试在数据库中插入日期格式时,它给了我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
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