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() 函数有几个重载版本,接受不同数据类型的参数:DATETIMESTAMPVARCHAR。当您使用无类型参数标记 (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 值计算时间戳?

如何查找当前时间戳和登录日期之间的天数 [重复]

计算响应时间

csharp 一个简单的帮助器,用于转换为/从unix时间戳和计算时间。

js实现的时间戳和时间日期的转换