DB2,当试图计算提供的和存储的时间戳之间的差异时,我得到一个错误'函数的调用是ambiquious'

时间:2015-05-13 11:45:06

标签: sql jdbc db2 db2-luw

这是我准备语句的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错误:   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

1 个答案:

答案 0 :(得分:2)

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

您可以显式指定参数数据类型以进行编译:{{1​​}}。或者,如果您使用的是最新的DB2 for LUW版本(9.7及更高版本),则可以设置DB2注册表变量:

DAYS(CAST(? AS TIMESTAMP))

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