DB2,在尝试计算提供的时间戳和存储的时间戳之间的差异时,出现错误“函数的调用不明确”
Posted
技术标签:
【中文标题】DB2,在尝试计算提供的时间戳和存储的时间戳之间的差异时,出现错误“函数的调用不明确”【英文标题】:DB2, when trying to calculate difference between provided and stored timestamp I get an error 'The invocation of function is ambiquious' 【发布时间】:2015-07-24 16:24:39 【问题描述】:这是我准备语句的 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;
哪里出错了?
谢谢。
附:如何计算时差的公式取自这篇文章: DB2 Basics: Fun with Dates and Times
【问题讨论】:
【参考方案1】:DAYS()
函数有几个重载版本,接受不同数据类型的参数:DATE
、TIMESTAMP
和 VARCHAR
。当您使用无类型参数标记 (DAYS(?)
) 时,查询编译器无法确定在查询中使用哪个版本的函数。
您可以为编译显式指定参数数据类型:DAYS(CAST(? AS TIMESTAMP))
。或者,如果您使用的是最新的 DB2 for LUW 版本(9.7 和更高版本),您可以设置 DB2 注册表变量:
db2set DB2_DEFERRED_PREPARE_SEMANTICS=YES
告诉编译器它应该将 PREPARE 调用推迟到查询执行时间,此时参数数据类型已知。
【讨论】:
谢谢,第一个选项更可取,因为我并不总是可以访问数据库以上是关于DB2,在尝试计算提供的时间戳和存储的时间戳之间的差异时,出现错误“函数的调用不明确”的主要内容,如果未能解决你的问题,请参考以下文章
如何找到纪元时间戳和 std::chrono::system_clock::now 之间的时间差(以毫秒为单位)
如何根据 PHP 中给定的时间戳和 GMTOffset 值计算时间戳?