java - 如何使用java准备语句在mysql的date_sub函数中添加单位

标签 java mysql prepared-statement

我正在尝试创建一个准备好的查询,其中日期的单位部分需要作为参数传递。下面是代码

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/

相关文章:

php - 每次我编辑一行时,它都会创建另一行

php - 如何显示/回显执行的 mysqli 准备好的语句中的数据

java - jooq 是否比 java 中的简单 sql 有任何性能领先

java - 自定义 DiscoveryClient 用于发现 Spring Cloud Config 服务器

Java JsonObject 数组值到键

java - 在没有 ChannelFuture 的情况下写入 Netty channel

php - 如何在存储过程中使用 MySQLi 准备语句

java - Maven(命令行): No compiler is provided in this environment

php - 在 Laravel 中的何处插入强制性业务数据

Mysql:如何使物化 View 中的列成为主键