3

Java を介して postgres テーブルに値を挿入しようとしています。列のタイプはタイムスタンプです。

コードは次のようになります。

SimpleDateFormat sdf= new SimpleDateFormat("yyyy-MM-dd HH:mm:ss", Locale.getDefault());
String gameStartedTime = format.format(new Date());

String query= "UPDATE gameStatus g SET g.status ='" + gameStatus
    + g.gameStartTime= to_date('"
            + gameStartedTime  + "','yyyy-MM-dd HH:mm:ss')"
    // Doesn't matter much
+ " WHERE g.status = 'STARTED' AND " + "g.condition="+ game.getCondition();

このステートメントを実行しようとすると失敗し、次のようなメッセージが表示されます。

エラー: フォーマット文字列の "mm" フィールドの値が矛盾しています。詳細: この値は、同じフィールド タイプの以前の設定と矛盾しています。

何が悪いのかわからない!!

これに関するヘルプは役に立ちます。前もって感謝します。-JE

4

5 に答える 5

6

mm常に関数の月ですto_date()mmと の間に違いはありませんMM(Java の SimpleDateFormat とは異なります)。

議事録に使用する必要がありますmi

すべてのパターンの完全なリストは、マニュアルで入手できます: http://www.postgresql.org/docs/current/static/functions-formatting.html#FUNCTIONS-FORMATTING-DATETIME-TABLE

しかし、そもそも「動的」SQL を使用するべきではありません。PreparedStatement代わりに, java.sql.Timestampandを使用することをお勧めしますsetTimestamp()。これにより、フォーマットの問題から解放され、SQL インジェクションから保護されます。

于 2013-05-13T11:21:51.543 に答える
2

試してみてください: ps.setTimestamp(position, new Timestamp(System.currentTimeMillis()));

于 2016-04-12T20:34:02.067 に答える
1

クエリから日付部分を分割して、これらの値を比較してみてください。分を表す mm はg.gameStartTime= to_date.

この部分をクエリの外に引っ張ると、値を確認できます。問題の原因がわかるかもしれません。

于 2013-05-13T11:21:11.920 に答える
1

この方法は、現在の時間を使用して機能します:

    String query = "INSERT INTO table1 (id,t) VALUES (?, ?)"; 
    //update table1 set t=? where id=?
    Connection con = null;
    PreparedStatement ps = null;
    try{
        con = dataSource.getConnection();
        ps = con.prepareStatement(query);

        ps.setLong(1, 1234); // update ps.setLong(2, 1234);
        Calendar cal = Calendar.getInstance();  
        Timestamp timestamp = new Timestamp(cal.getTimeInMillis());
        ps.setTimestamp(2,timestamp); // ps.setTimestamp(1,timestamp);
        int out = ps.executeUpdate();
        if(out !=0){
            System.out.println("Record saved");
        }
    }catch(SQLException e){
        e.printStackTrace();
    }finally{
        try {
            ps.close();
            con.close();
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }

または、次の行を使用して特定のタイムスタンプを設定できます。

    Calendar cal = Calendar.getInstance();
    cal.set(Calendar.YEAR, 2015); 
    cal.set(Calendar.MONTH, 0); // 0 january
    cal.set(Calendar.DAY_OF_MONTH, 26); 
    cal.set(Calendar.HOUR_OF_DAY, 10); 
    cal.set(Calendar.MINUTE, 47);
    cal.set(Calendar.SECOND, 0);
    cal.set(Calendar.MILLISECOND, 0);
    Timestamp timestamp = new Timestamp(cal.getTimeInMillis());
于 2015-01-26T17:52:26.770 に答える