我有以下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 ?
。
另请参阅这个有些相关的问题。
如果您无法“用 Java 计算上限”,那么您可以使用
add_<intervalname>()
函数。
使用原始问题中的条件,
PC_DATE BETWEEN ? AND (? + 4 MONTHS)
将被重写为PC_DATE BETWEEN ? AND add_months(?, 4)
。
再举个例子,在 maximo 关系中,您必须将
statusdate between :schedstart and :schedstart + 10 minutes
写为 statusdate between :schedstart and add_minutes(:schedstart, 10)
。