DB2,在尝试计算提供的时间戳和存储的时间戳之间的差异时出现错误 'The invocation of function is ambiquious'

DB2, when trying to calculate difference between provided and stored timestamp I get an error 'The invocation of function is ambiquious'

这是我的 sql 字符串,我从中准备语句:

SELECT (DAYS(?) - DAYS(FROM)) * 86400 + (MIDNIGHT_SECONDS(?) -
           MIDNIGHT_SECONDS(FROM)) AS FROM_DIFF,
       (DAYS(?) - DAYS(TO)) * 86400 + (MIDNIGHT_SECONDS(?) - 
           MIDNIGHT_SECONDS(TO)) AS TO_DIFF
FROM CALENDAR.EVENTS WHERE ID = ?

使用以下代码填充值:

        ps.setTimestamp(1, new Timestamp(...));
        ps.setTimestamp(2, new Timestamp(...));
        ps.setTimestamp(3, new Timestamp(...));
        ps.setTimestamp(4, new Timestamp(...));
        ps.setInt(5, ...);

并得到异常:

com.ibm.db2.jcc.am.SqlSyntaxErrorException: DB2 SQL Error: SQLCODE=-245, SQLSTATE=428F5, SQLERRMC=DAYS;1, DRIVER=4.16.53

当我 运行 直接从 SQL 浏览器时 运行 完美无缺:

SELECT 
    (DAYS('2015-05-05 00:00:00.0') - DAYS(FROM)) * 86400 + (MIDNIGHT_SECONDS('2015-05-05 00:00:00.0') - MIDNIGHT_SECONDS(FROM)) AS FROM_DIFF,
    (DAYS('2015-05-05 00:00:00.0') - DAYS(TO)) * 86400 + (MIDNIGHT_SECONDS('2015-05-05 00:00:00.0') - MIDNIGHT_SECONDS(TO)) AS TO_DIFF  
FROM CALENDAR.EVENTS WHERE ID = 1055;

哪里错了?

谢谢。

P.S。计算时差的公式取自这篇文章: DB2 Basics: Fun with Dates and Times

DAYS() 函数有多个重载版本,接受不同数据类型的参数:DATETIMESTAMPVARCHAR。当您使用无类型参数标记 (DAYS(?)) 时,查询编译器无法确定在查询中使用哪个版本的函数。

编译时可以明确指定参数数据类型:DAYS(CAST(? AS TIMESTAMP))。或者,如果您使用最新的 DB2 for LUW 版本(9.7 和更高版本),您可以设置 DB2 注册表变量:

db2set DB2_DEFERRED_PREPARE_SEMANTICS=YES

告诉编译器它应该将 PREPARE 调用推迟到查询执行时间,此时参数数据类型已知。