2016-12-25 1 views
1

JavaからOracleデータベースに日付を挿入するときはいつでも問題が発生します。ここでSQL Developerでは挿入日は使用できますが、Javaでは使用できません

は私の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:リテラルが書式文字列に

と一致していませんしかし、私はSQL開発者に同じステートメントを置く:

insert into QuickTicket (issueDate , pssngr_id , trip_number) values 
('2016/12/25' , 1234567897 , 4) ; 

エラーが発生しない - > 1行が挿入されています。

理由は何ですか?

+1

親愛なるダウン投票者:あなたはいつでも下院議員を歓迎しますが、私が質問を改善できる理由を述べてください。 –

+1

最初の行をこの 'PreparedStatement perst = myConn.prepareStatement(" QuickTicket(issueDate、pssngr_id、trip_number)の値(?、?、?); ")に挿入してください。 – SteelToe

+0

あなたの書式について作業してください。 –

答えて

4

SQL DeveloperのセッションとJava環境には、異なるNLS設定があります。日付はYYYY/MM/DD形式であり、もう1つは他の形式です。環境を強制的に一致させることはできますが、必ずしもそれを制御することはできません。とにかくNLS設定に依存しないほうがよいでしょう。

あなたはto_date()を使用してINSERT文の一部としてフォーマットを指定するか必要があります。

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

または好ましくは日付変数を使用して、あなたの文字列の形式を変更、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からそれを得ることができ、現在の日付を挿入しようとしている場合:

012それぞれ、サーバーの時間とクライアントの時間( sysdateまたは current_dateを使用して単にオラクル内から
prest.setDate(1, new java.sql.Date(System.currentTimeMillis())); 

以上、;この場合には、おそらくサーバー):?

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を使ってください。

3

私はissueDateを推測していますが、あなたが日付ではなく、それが動作するはずの文字列

prest.setDate(1, java.sql.Date.valueOf(s)); 

代わりの

prest.setString(1, s); 

をバインドすることを意味する、データベース内の日付型です。

+2

実際には、日付「2016/12/25」を「2016-12-25」に変更する必要があります。 –

+0

http://docs.oracle.com/javase/8/docs/api/java/sql/Date.html#valueOf-java.lang.String- –

+0

あなたはそれを釘付けにしました。私はちょうど文字列を渡すだろうと思って、データベースはそれを処理します。感謝の嵐。 –

関連する問題