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 在使用 Maven 时给出 ClassNotFoundException: org.apache.derby.jdbc.EmbeddedDriver