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

时间:2015-04-09 09:34:51

标签: sql jdbc db2

我有以下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%');

我做错了什么?谢谢。

1 个答案:

答案 0 :(得分:1)

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

另见this somewhat related question