2013-05-13 3 views
1

Я пытаюсь вставить значение в таблицу postgres через 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(); 

Теперь, когда я пытаюсь выполнить это заявление он терпит неудачу, я получаю сообщение, как это:

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 и конвертировать Date to time Stamp как этот Timestamp timestamp = новая отметка времени (sign_date.getTime()); \t \t this.sign_date = timestamp; –

ответ

4

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.Timestamp и setTimestamp(). Это облегчит вам любые проблемы с форматированием и защитит вас от SQL-инъекций.

+0

Спасибо @ a_horse_with_no_name! Большое спасибо, это помогло !!!! –

1

Попробуйте разделить часть даты на запрос и попытаться сравнить эти значения. Похоже (по крайней мере, с того места, где я вижу), что мм, стоящий в течение минут, не соответствует g.gameStartTime= to_date.

Если вы вытащите эту деталь за пределы запроса, вы можете проверить значения, возможно, вы обнаружите, в чем проблема.

+0

'мм' делает ** нет ** подставка * Минуты * –

+0

Ой, спасибо a_horse_with_no_name. Поэтому я тоже кое-что узнал. – Skillcoil

1

сделать это.

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

Затем добавьте this.date в базу данных ..

+0

Я пробовал это не помогло –

+0

не нужно форматировать дату. –

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 (позиция, новая временная метка (System.currentTimeMillis()));

Смежные вопросы