PreparedStatement.setString()调用表现得很奇怪

kma*_*ks2 0 java sql

这可能很简单,但我不明白出了什么问题.

作为背景,我使用PreparedStatements和模板查询来提高效率.我调用setString(index,argument)来填充模板的各个部分,在填充所有字段之后,我调用execute语句.

这是一个当前事物的片段(当然它是有效的):

   stmnt.setInt(1, node.getI_ID());
   stmnt.setString(2, node.getTime());
   stmnt.setInt(3, node.getMemoryAddress());
   stmnt.executeUpdate();
Run Code Online (Sandbox Code Playgroud)

getI_ID返回一个5位数的int数,如10014,与getMemoryAddress相同.getTime返回类似"2011-03-14_13:23:00"的日期时间.

目标是当查询最终执行该日期时间的小时但增加1时,但我不能修改从getTime返回的值这一事实,即这应该通过添加一些快速和脏的方式来完成sql代码.

这是我最初想出的:

   stmnt.setInt(1, node.getI_ID());
   stmnt.setString(2, node.getTime() + " interval 1 hour");
   stmnt.setInt(3, node.getMemoryAddress());
   stmnt.executeUpdate();
Run Code Online (Sandbox Code Playgroud)

但是,执行时,getTime的未修改值应该在我新添加的行中.当PreparedStatement将String转换为VARCHAR或DATETIME时,是否存在适用的字符串条件?或者字符串可能不包含多个令牌或其他内容?

此外,我无法在查询模板中添加"间隔1小时",因为并非所有节点都需要添加一小时.

任何帮助深表感谢.谢谢.

Jim*_*son 5

在声明中

   stmnt.setString(2, node.getTime() + " interval 1 hour");
Run Code Online (Sandbox Code Playgroud)

字符串连接发生在Java中,而不是SQL中.如果node.getTime()返回,比如说"2011-03-14_13:23:00",则在setString()中发送以下值:

"2011-03-14_13:23:00 interval 1 hour"
Run Code Online (Sandbox Code Playgroud)

这可能不是你想要的."间隔1小时"不会修改SQL,它是赋予SQL语句的值的一部分.

如果要将小时增加1,则应将字符串值解析为GregorianCalendar,在那里增加小时,然后格式化结果并将其发送到SQL语句.例如:

    DateFormat df = new SimpleDateFormat("yyyy-MM-dd_HH:mm:ss");
    String input = "2011-03-14_13:23:00";
    Date d = df.parse(input);
    GregorianCalendar c = new GregorianCalendar();
    c.setTime(d);
    c.add(Calendar.HOUR_OF_DAY, 1);
    String output = df.format(c.getTime());
Run Code Online (Sandbox Code Playgroud)