当用于TIMESTAMPDIFF计算时,如何在预准备语句中设置java.sql.Timestamp?

时间:2017-04-08 21:01:45

标签: java sql jdbc db2 jdbctemplate

我目前面临以下问题: 我想在预准备语句中获取当前时间与给定时间戳之间的时间差。

public List<Foo> getFoos(String id, Timestamp ts) {
     return jdbcTemplate.query(
            "SELECT TIMESTAMPDIFF(2, (CURRENT TIMESTAMP - ?)) AS NEW_TIMESTAMP FROM SCHEMA.TABLE WHERE ID = ?",
            new Object[]{ts, id},
            (rs, rowNum) -> mapFooFromResultSet());
}

此查询将失败并显示

com.ibm.db2.jcc.am.SqlSyntaxErrorException: DB2 SQL Error: SQLCODE=-402, SQLSTATE=42819, SQLERRMC=-, DRIVER=

-402   AN ARITHMETIC FUNCTION OR OPERATOR function-operator IS APPLIED TO CHARACTER OR DATETIME DATA

我正在使用DB2数据库,无法切换到任何其他数据库驱动程序。

所以我的问题是如何在当前时间和给定java.sql.Timestamp值之间的sql语句中实现时差?

提前感谢您的帮助。

2 个答案:

答案 0 :(得分:0)

似乎函数TIMESTAMPDIFF不接受时间戳,但需要docs string-expression段中指定的字符串值。在示例中,他们使用CASTCHARTIMESTAMP函数,因此以下内容可能会解决问题。

需要以YYYY-MM-DD-hh.mm.ss格式指定相应的String值,而不是Timestamp对象:

SELECT TIMESTAMPDIFF(2, CHAR(CURRENT TIMESTAMP - TIMESTAMP(?))) AS NEW_TIMESTAMP 
FROM SCHEMA.TABLE 
WHERE ID = ?

答案 1 :(得分:0)

如@Idz所述,TIMESTAMPDIFF需要string-expression。查看所提供网站上的最后一个示例,您将看到解决方案。

对于我的示例,它使用以下代码:

 "SELECT TIMESTAMPDIFF(2, CAST(CURRENT_TIMESTAMP - CAST(? AS TIMESTAMP) AS CHAR(22))) AS NEW_TIMESTAMP FROM SCHEMA.TABLE WHERE ID = ?"