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”字段的值冲突。DETAIL:此值与先前对相同字段类型的设置相矛盾。

我不知道出了什么问题!

对此的任何帮助都会很有用。提前致谢。-乙脑

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.TimestampsetTimestamp()代替。这可以使您摆脱任何格式问题并保护您免受 SQL 注入。

于 2013-05-13T11:21:51.543 回答
2

试试看: ps.setTimestamp(position, new Timestamp(System.currentTimeMillis()));

于 2016-04-12T20:34:02.067 回答
1

这样做。

java.sql.Date date=new Date();
Timestamp timestamp = new Timestamp(date.getTime());
this.date = timestamp;

然后添加this.date到数据库..

于 2013-05-13T11:34:17.423 回答
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 回答