插入日期适用于SQL Developer,但不适用于Java

时间:2016-12-25 02:32:04

标签: java sql oracle

每当我想将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行。

知道为什么吗?

2 个答案:

答案 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内部,使用sysdatecurrent_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);

它应该有用。