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()
函数有多个重载版本,接受不同数据类型的参数:DATE
、TIMESTAMP
和 VARCHAR
。当您使用无类型参数标记 (DAYS(?)
) 时,查询编译器无法确定在查询中使用哪个版本的函数。
编译时可以明确指定参数数据类型:DAYS(CAST(? AS TIMESTAMP))
。或者,如果您使用最新的 DB2 for LUW 版本(9.7 和更高版本),您可以设置 DB2 注册表变量:
db2set DB2_DEFERRED_PREPARE_SEMANTICS=YES
告诉编译器它应该将 PREPARE 调用推迟到查询执行时间,此时参数数据类型已知。
这是我的 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()
函数有多个重载版本,接受不同数据类型的参数:DATE
、TIMESTAMP
和 VARCHAR
。当您使用无类型参数标记 (DAYS(?)
) 时,查询编译器无法确定在查询中使用哪个版本的函数。
编译时可以明确指定参数数据类型:DAYS(CAST(? AS TIMESTAMP))
。或者,如果您使用最新的 DB2 for LUW 版本(9.7 和更高版本),您可以设置 DB2 注册表变量:
db2set DB2_DEFERRED_PREPARE_SEMANTICS=YES
告诉编译器它应该将 PREPARE 调用推迟到查询执行时间,此时参数数据类型已知。