我正在尝试创建一个准备好的查询,其中日期的单位部分需要作为参数传递。下面是代码
PreparedStatement ps = conn.prepareStatement("select DATE_SUB(UTC_TIMESTAMP(),INTERVAL ? ?)");
ps.setInt(1,timeInterval);
ps.setString(2,unit);
注意:timeInterval
是一个int
变量,unit
是一个String
变量,可以是“DAY” 、“分钟”等等。
使用此最终查询构建为
select DATE_SUB(1511846832475,INTERVAL 2 'DAY')
但是当我运行它时,会引发以下异常。
com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ''Day')' at line 1
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
at java.lang.reflect.Constructor.newInstance(Constructor.java:423)
at com.mysql.jdbc.Util.handleNewInstance(Util.java:406)
at com.mysql.jdbc.Util.getInstance(Util.java:381)
at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:1030)
at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:956)
at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3491)
at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3423)
最佳答案
据我所知,您无法使用占位符来表示间隔单位。其原因是,正如您所见,将单元绑定(bind)为字符串会使用单引号对其进行转义。但是可以使用数量占位符,您已经在代码片段中这样做了。
我可以提供两种解决方法。一是您有单独的准备好的语句,具体取决于间隔是否为 DAY、MINUTE 等。但这对你来说可能感觉有点笨拙。另一种解决方法是将所有间隔值转换为通用单位,例如分钟。然后,只需使用以下单个准备好的语句即可完成所有操作:
String query = "SELECT DATE_SUB(UTC_TIMESTAMP(), INTERVAL ? MINUTE)";
PreparedStatement ps = conn.prepareStatement(query);
ps.setInt(1, timeInterval);
关于java - 如何使用java准备语句在mysql的date_sub函数中添加单位,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47524582/