问题描述
我需要如何发送该字段的值,以便正确地对其进行转换。目前,我要发送日期类型为 value-> 2020-10-10
的日期类型字段
这是查询:
query.append("SELECT * from STUDENT where")
.append(" CAST(STUDENT.ADM_DTTM AS DATE) BETWEEN")
.append(" CAST(")
.append("?")
.append(" AS DATE) AND")
.append(" CURRENT_DATE-5 DAY");
final Date[] args = new Date[]{getMyDate()};
int[] types = new int[]{Types.DATE};
result = jdbcTemplate.query(query,args,types,new Mapper());
这是详细的堆栈跟踪:
nested exception is com.ibm.db2.jcc.am.sqlException: DB2 sql Error: sqlCODE=-313,sqlSTATE=07001,sqlERRMC=null,DRIVER=4.19.66
at org.springframework.jdbc.support.sqlStatesqlExceptionTranslator.doTranslate(sqlStatesqlExceptionTranslator.java:101) ~[spring-jdbc-5.1.5.RELEASE.jar:5.1.5.RELEASE]
at org.springframework.jdbc.support.AbstractFallbacksqlExceptionTranslator.translate(AbstractFallbacksqlExceptionTranslator.java:72) ~[spring-jdbc-5.1.5.RELEASE.jar:5.1.5.RELEASE]
at org.springframework.jdbc.support.AbstractFallbacksqlExceptionTranslator.translate(AbstractFallbacksqlExceptionTranslator.java:81) ~[spring-jdbc-5.1.5.RELEASE.jar:5.1.5.RELEASE]
at org.springframework.jdbc.support.AbstractFallbacksqlExceptionTranslator.translate(AbstractFallbacksqlExceptionTranslator.java:81) ~[spring-jdbc-5.1.5.RELEASE.jar:5.1.5.RELEASE]
at org.springframework.jdbc.core.JdbcTemplate.translateException(JdbcTemplate.java:1444) ~[spring-jdbc-5.1.5.RELEASE.jar:5.1.5.RELEASE]
at org.springframework.jdbc.core.JdbcTemplate.execute(JdbcTemplate.java:632) ~[spring-jdbc-5.1.5.RELEASE.jar:5.1.5.RELEASE]
at org.springframework.jdbc.core.JdbcTemplate.query(JdbcTemplate.java:669) ~[spring-jdbc-5.1.5.RELEASE.jar:5.1.5.RELEASE]
at org.springframework.jdbc.core.JdbcTemplate.query(JdbcTemplate.java:700) ~[spring-jdbc-5.1.5.RELEASE.jar:5.1.5.RELEASE]
at org.springframework.jdbc.core.JdbcTemplate.query(JdbcTemplate.java:706) ~[spring-jdbc-5.1.5.RELEASE.jar:5.1.5.RELEASE]
final Date[] args = new Date[]{
getMyDate(),getMyDate(),getMyDate()
};
int[] types = new int[]{Types.DATE,Types.DATE,Types.DATE};
错误:
nested exception is com.ibm.db2.jcc.am.sqlSyntaxErrorException: DB2 sql Error: sqlCODE=-401,sqlSTATE=42818,DRIVER=4.19.66
at org.springframework.jdbc.support.sqlExceptionSubclasstranslator.doTranslate(sqlExceptionSubclasstranslator.java:93) ~[spring-jdbc-5.1.5.RELEASE.jar:5.1.5.RELEASE]
at org.springframework.jdbc.support.AbstractFallbacksqlExceptionTranslator.translate(AbstractFallbacksqlExceptionTranslator.java:72) ~[spring-jdbc-5.1.5.RELEASE.jar:5.1.5.RELEASE]
at org.springframework.jdbc.support.AbstractFallbacksqlExceptionTranslator.translate(AbstractFallbacksqlExceptionTranslator.java:81) ~[spring-jdbc-5.1.5.RELEASE.jar:5.1.5.RELEASE]
at org.springframework.jdbc.core.JdbcTemplate.translateException(JdbcTemplate.java:1444) ~[spring-jdbc-5.1.5.RELEASE.jar:5.1.5.RELEASE]
at org.springframework.jdbc.core.JdbcTemplate.execute(JdbcTemplate.java:632) ~[spring-jdbc-5.1.5.RELEASE.jar:5.1.5.RELEASE]
at org.springframework.jdbc.core.JdbcTemplate.query(JdbcTemplate.java:669) ~[spring-jdbc-5.1.5.RELEASE.jar:5.1.5.RELEASE]
at org.springframework.jdbc.core.JdbcTemplate.query(JdbcTemplate.java:700) ~[spring-jdbc-5.1.5.RELEASE.jar:5.1.5.RELEASE]
at org.springframework.jdbc.core.JdbcTemplate.query(JdbcTemplate.java:706) ~[spring-jdbc-5.1.5.RELEASE.jar:5.1.5.RELEASE]
解决方法
实际上,您在DB2查询中根本不需要任何强制转换:
SELECT *
FROM STUDENT
WHERE ADM_DTTM >= ? AND ADM_DTTM < CURRENT_DATE - 5 DAY;
这样做的原因是,范围比较的下限首先是有效的DB2日期文字。这不需要任何强制转换即可代表日期。其次,由于ADM_DTTM
是一个日期时间(大概是日期时间),所以我们不需要强制转换它。如果将其作为日期时间传递,则在转换为日期时也将通过。
我省略了JDBC模板查询的实际更新代码。假设语法已经正确,则上面的查询应该不会给您任何错误。