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

问题描述 投票:0回答:2

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

我做错了什么?谢谢你。

sql jdbc db2
2个回答
1
投票

日期时间算术表达式是原子的,即

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

另请参阅这个有些相关的问题


0
投票

如果您无法“用 Java 计算上限”,那么您可以使用

add_<intervalname>()
函数。

使用原始问题中的条件,

PC_DATE BETWEEN ? AND (? + 4 MONTHS)
将被重写为
PC_DATE BETWEEN ? AND add_months(?, 4)

再举个例子,在 关系中,您必须将

statusdate between :schedstart and :schedstart + 10 minutes
写为
statusdate between :schedstart and add_minutes(:schedstart, 10)

© www.soinside.com 2019 - 2024. All rights reserved.