63

コードをより標準的なものにするために、SQL 変数をハードコードしたすべての場所を準備済みステートメントに変更し、代わりに変数をバインドするように求められました。

しかし、私はで問題に直面していsetDate()ます。

コードは次のとおりです。

        DateFormat dateFormatYMD = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss");
        DateFormat dateFormatMDY = new SimpleDateFormat("MM/dd/yyyy HH:mm:ss");
        Date now = new Date();
        String vDateYMD = dateFormatYMD.format(now);
        String vDateMDY = dateFormatMDY.format(now);
        String vDateMDYSQL =  vDateMDY ;
        java.sql.Date date = new java.sql.Date(0000-00-00);

   requestSQL = "INSERT INTO CREDIT_REQ_TITLE_ORDER (REQUEST_ID," + 
                " ORDER_DT, FOLLOWUP_DT) " +  "values(?,?,?,)";


                prs = conn.prepareStatement(requestSQL);

                prs.setInt(1,new Integer(requestID));

                prs.setDate(2,date.valueOf(vDateMDYSQL));
                prs.setDate(3,date.valueOf(sqlFollowupDT));

SQL が実行されると、次のエラーが発生します。

    java.lang.IllegalArgumentException
    at java.sql.Date.valueOf(Date.java:138)
    at com.cmsi.eValuate.TAF.TAFModuleMain.CallTAF(TAFModuleMain.java:1211)

setString()代わりに aを使用する必要がありto_date()ますか?

4

6 に答える 6

160

❐ 使用するjava.sql.Date

テーブルに type の列がある場合DATE:

  • java.lang.String

    メソッドjava.sql.Date.valueOf(java.lang.String)は、形式 の日付を表す文字列を受け取りましたyyyy-[m]m-[d]d。例えば:

    ps.setDate(2, java.sql.Date.valueOf("2013-09-04"));
    
  • java.util.Date

    endDatetypeの変数があるとしますjava.util.Date。次のように変換します。

    ps.setDate(2, new java.sql.Date(endDate.getTime());
    
  • 現時点の

    現在の日付を挿入する場合:

    ps.setDate(2, new java.sql.Date(System.currentTimeMillis()));
    
    // Since Java 8
    ps.setDate(2, java.sql.Date.valueOf(java.time.LocalDate.now()));
    

❐ 使用するjava.sql.Timestamp

TIMESTAMPテーブルにタイプorの列がある場合DATETIME:

  • java.lang.String

    メソッドjava.sql.Timestamp.valueOf(java.lang.String)は、形式 の日付を表す文字列を受け取りましたyyyy-[m]m-[d]d hh:mm:ss[.f...]。例えば:

    ps.setTimestamp(2, java.sql.Timestamp.valueOf("2013-09-04 13:30:00");
    
  • java.util.Date

    endDatetypeの変数があるとしますjava.util.Date。次のように変換します。

    ps.setTimestamp(2, new java.sql.Timestamp(endDate.getTime()));
    
  • 現時点の

    現在のタイムスタンプが必要な場合:

    ps.setTimestamp(2, new java.sql.Timestamp(System.currentTimeMillis()));
    
    // Since Java 8
    ps.setTimestamp(2, java.sql.Timestamp.from(java.time.Instant.now()));
    ps.setTimestamp(2, java.sql.Timestamp.valueOf(java.time.LocalDateTime.now()));
    
于 2013-09-04T13:27:41.390 に答える
3

あなたが抱えている問題は、フォーマットされた java.util.Date から互換性のないフォーマットを渡して のインスタンスを構築していることです。これは、異なるフォーマットを使用するため、使用java.sql.Date時に同じように動作しません。valueOf()

また、時間と分を保持することを目指していることもわかりますjava.sql.Timestamp。データベースフィールドを DATETIME または同様のものに変更するとともに、データ型を時間と分をサポートする に変更することをお勧めします (データベースによって異なります)。ベンダー)。

とにかく、から変更したい場合は、使用することをおjava.util.Date to java.sql.Date勧めします

java.util.Date date = Calendar.getInstance().getTime();
java.sql.Date sqlDate = new java.sql.Date(date.getTime()); 
// ... more code here
prs.setDate(sqlDate);
于 2013-09-04T13:32:53.783 に答える
3

ドキュメントは、それjava.sql.Dateがスローされると明示的に言っています:

  • IllegalArgumentException- 指定された日付が JDBC 日付エスケープ形式でない場合 ( yyyy-[m]m-[d]d)

Stringまた、 date をthen に変換する必要はありません。これは不必要に思えますsql.date(そしてバグが発生しやすい!)。代わりに、次のことができます。

java.sql.Date sqlDate := new java.sql.Date(now.getTime());
prs.setDate(2, sqlDate);
prs.setDate(3, sqlDate);
于 2013-09-04T13:31:55.857 に答える