问题在Postgres表中插入时间戳

时间:2013-05-13 11:16:48

标签: java postgresql jdbc

我试图通过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

5 个答案:

答案 0 :(得分:5)

mm 始终 to_date()功能的月份。 mmMM之间没有区别(与Java的SimpleDateFormat不同)。

您需要使用mi作为会议记录。

手册中提供了所有模式的完整列表:http://www.postgresql.org/docs/current/static/functions-formatting.html#FUNCTIONS-FORMATTING-DATETIME-TABLE

但是你不应该首先使用“动态”SQL。最好使用PreparedStatementjava.sql.TimestampsetTimestamp()代替。这可以减轻您的格式问题,并保护您免受SQL注入。

答案 1 :(得分:1)

尝试从查询中拆分日期部分并尝试比较这些值。 看来(至少从我看到的地方)mm代表几分钟, 不符合g.gameStartTime= to_date

如果您将此部分拉到查询之外,您可以检查值,也许您会发现问题所在。

答案 2 :(得分:1)

这样做。

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

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

答案 3 :(得分:0)

这种方式适合我使用当前时间:

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

答案 4 :(得分:0)

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