我试图通过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
答案 0 :(得分:5)
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注入。
答案 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()));