在 sql 之后使用带有算术计算的 PreparedStatement 时,具有 DATETIME 值的算术表达式无效

An arithmetic expression with a DATETIME value is invalid while using PreparedStatement with Arithmetic calculation in sql later

我有以下 sql 查询:

    SELECT COUNT(*) FROM PC_DATA
    WHERE PC_DATE BETWEEN ? AND (? + 4 MONTHS)
    AND UPPER(PC_TYPE) LIKE UPPER(?)

现在我尝试通过 JAVA 中的以下代码设置 Dates 的值:

Date start = new Date(quaterStart.getTimeInMillis());

stmt.setDate(1, start);
stmt.setDate(2, start);
stmt.setString(3, "%" + type + "%");

当我 运行 它时,我得到以下异常:DB2 SQL Error: SQLCODE=-182, SQLSTATE=42816, SQLERRMC=null, DRIVER=4.16.53

虽然我尝试 运行 通过以下方式从控制台进行此 sql 查询,但它 运行 没有任何问题:

 SELECT COUNT(*) FROM PC_DATA
  WHERE PC_DATE BETWEEN  DATE('2015-01-01') AND (DATE('2015-01-01') + 4 MONTHS)
  AND UPPER(PC_TYPE) LIKE UPPER('%laptop%');

我做错了什么?谢谢。

日期时间算术表达式是原子的,即<date> + 4 months是一个完整的表达式,不能只用变量(参数)替换其中的一部分。您必须在 Java 代码中计算上限日期并将查询文本更改为 ...WHERE PC_DATE BETWEEN ? AND ?.

另见