每当我想将Java中的日期插入Oracle数据库时,我就会遇到问题。
以下是我的Java代码示例:
PreparedStatement prest = myConn.prepareStatement(
"insert into QuickTicket (issueDate , pssngr_id , trip_number) values(?,?,?)") ;
String s = "2016/12/25" ;
prest.setString(1, s);
prest.setInt(2, passengerID);
prest.setInt(3, tripID);
prest.executeUpdate();
例外:
java.sql.SQLDataException:ORA-01861:literal与格式字符串不匹配
但是,当我在SQL Developer中添加相同的语句时:
insert into QuickTicket (issueDate , pssngr_id , trip_number) values
( '2016/12/25' , 1234567897 , 4 ) ;
我没有错误 - >插入1行。
知道为什么吗?
答案 0 :(得分:4)
您的SQL Developer会话和Java环境具有不同的NLS设置;一个期望YYYY / MM / DD格式的日期,另一个期望其他的日期。您可以强制环境匹配,但您无法始终控制环境,最好不要依赖NLS设置。
您需要使用to_date()
指定格式作为插入语句的一部分:
PreparedStatement prest = myConn.prepareStatement(
"insert into QuickTicket (issueDate , pssngr_id , trip_number) values(to_date(?, 'YYYY/MM/DD'),?,?)") ;
String s = "2016/12/25" ;
prest.setString(1, s);
...
或者最好使用Date变量,并使用setDate()
而不是setString()
进行设置,更改字符串to what valueOf()
expects的格式,正如JohnMatthewIanDavis所指出的那样:
PreparedStatement prest = myConn.prepareStatement(
"insert into QuickTicket (issueDate , pssngr_id , trip_number) values(?,?,?)") ;
String s = "2016-12-25" ;
prest.setDate(1, java.sql.Date.valueOf(s));
...
如果你真的试图插入当前日期,你可以从Java获得:
prest.setDate(1, new java.sql.Date(System.currentTimeMillis()));
或更简单地来自Oracle内部,使用sysdate
或current_date
(分别用于服务器时间和客户端时间;在这种情况下可能是服务器?):
PreparedStatement prest = myConn.prepareStatement(
"insert into QuickTicket (issueDate , pssngr_id , trip_number) values(trunc(sysdate),?,?)") ;
prest.setInt(1, passengerID);
prest.setInt(2, tripID);
trunc()
将插入值的时间设置为午夜。如果你想保留时间,只需使用普通sysdate
。
答案 1 :(得分:3)
我猜测issueDate是数据库中的Date类型,这意味着你想绑定一个Date而不是一个String
prest.setDate(1, java.sql.Date.valueOf(s));
而不是
prest.setString(1, s);
它应该有用。