Derby SQL 时间戳算术和 JDBC 转义语法

Posted

技术标签:

【中文标题】Derby SQL 时间戳算术和 JDBC 转义语法【英文标题】:Derby SQL Timestamp Arithmetic and JDBC escape syntax 【发布时间】:2014-04-22 16:56:50 【问题描述】:

我的表中有两列,Created(TIMESTAMP) 和lifetime(BIGINT)。生命周期以秒表示。我想将生命周期列添加到时间戳列,并将该结果与另一个日期进行比较。

我引用了derby manual,并在“fn 关键字的 JDBC 转义语法”部分找到了对 TIMESTAMPADD 的支持:

fn 函数调用 TIMESTAMPADD(interval, integerExpression, timestampExpression)

好的,我试过了:

SELECT i.messageId FROM ServerMessageEntity i
WHERE fn TIMESTAMPADD(SQL_TSI_SECOND, i.lifetime, i.created) > :now

*:现在是我传入的参数:

query.setParameter

不幸的是,我得到了以下异常:

异常描述:解析查询时出现语法错误 [SELECT i.messageId 来自 ServerMessageEntity i WHERE fn TIMESTAMPADD(SQL_TSI_SECOND, i.lifetime, i.created) > :now], 意外的字符 []。

似乎解决方案是将秒添加到创建的时间戳,并让结果成为另一个时间戳。任何有关如何执行此操作的帮助或语法将不胜感激。谢谢!

其他信息:我将 Oracle TopLink 12c (12.1.2) 用于 ORM 和 Derby 10.10.2.0

【问题讨论】:

【参考方案1】:

原来我的问题是使用“@NamedQuery”来存储查询。我通过使用“createNativeQuery”方法进行了实验,并且能够得到我想要的结果

String sql = "SELECT MESSAGEID FROM \"TABLE\".SERVERMESSAGES WHERE fn TIMESTAMPADD(SQL_TSI_SECOND, LIFETIME, CREATED) < ?"
Query query = entityManager.createNativeQuery(sql);

【讨论】:

以上是关于Derby SQL 时间戳算术和 JDBC 转义语法的主要内容,如果未能解决你的问题,请参考以下文章

Derby 和 Circumflex ORM 的 SQL 语法错误

Derby Trigger on UPDATE:如何更新时间戳?

如何在 Rust Diesel 中使用时间戳和间隔进行算术运算

Derby/JDBC 连接生命周期(或空闲超时)

Derby 在使用 Maven 时给出 ClassNotFoundException: org.apache.derby.jdbc.EmbeddedDriver

Derby 数据库连接问题