2013-05-13 248 views
1

我想通過Java在postgres表中插入一個值。列類型是時間戳。問題在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(); 

現在,當我嘗試執行該語句失敗我得到的消息是這樣的:

ERROR: conflicting values for "mm" field in formatting string. DETAIL: This value contradicts a previous setting for the same field type.

我不知道是怎麼回事錯! !

對此的任何幫助將是有用的。 在此先感謝。 -JE

+0

使用java.sql.Date並將日期轉換爲時間戳如下 Timestamp timestamp = new Timestamp(sign_date.getTime()); \t \t this.sign_date = timestamp; – 2013-05-13 11:30:46

回答

4

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注入。

+0

謝謝@ a_horse_with_no_name!非常感謝它幫助! – 2013-05-13 11:38:12

1

嘗試從查詢中拆分日期部分並嘗試比較這些值。 它似乎(至少從我看到的地方),代表分鐘的mm, 不符合g.gameStartTime= to_date

如果您將這部分拉出查詢之外,您可以檢查這些值,也許您會發現問題出在哪裏。

+0

'mm'確實**不**代表*分鐘* – 2013-05-13 11:40:56

+0

哎呀,謝謝a_horse_with_no_name。所以我也自己也學會了一些東西。 – Skillcoil 2013-05-13 11:45:21

1

是這樣做的。

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

然後加入this.date到數據庫..使用當前時間

+0

我試過這個沒有幫助 – 2013-05-13 11:39:05

+0

不需要格式化日期。 – 2013-05-13 11:40:13

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

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