2015-11-30 108 views
0

我们的主数据库是MySQL。试图(和失败)为H2数据库创建用户函数

很少有查询使用相当常见的DATE_SUB($date, INTERVAL $duration $type)

我们正在对H2数据库运行我们的测试,并且缺少DATE_SUB()函数会产生问题。
我们有一个创建用户H2函数来复制MySQL行为的想法 - 我有两个单独的尝试,两个实现都存在并分别映射。

org.h2.jdbc.JdbcSQLException: Syntax error in SQL statement 
... 
DATE_SUB(?, INTERVAL 1[*] DAY) 
expected "., (, [, ::, *, /, %, +, -, ||, ~, !~, NOT, LIKE, REGEXP, IS, IN, BETWEEN, AND, OR,), ,"; 

它看起来像H2甚至没有尝试使用我的用户功能,但在试图解析SQL语句失败:

CREATE ALIAS IF NOT EXISTS DATE_SUB FOR "xxx.yyy.Zzz.dateSubtract"; 

public Zzz { 
     ... 
     public static Date dateSubtract(Connection connection, String dateValue, String formula) { 
      return dateSubtractJava(dateValue, formula); 
     } 

     public static Date dateSubtract(Connection connection, String dateValue, String INTERVAL, String numberOfDateIntervals, String dateIntervalName) { 
      return dateSubtractJava(dateValue, INTERVAL, numberOfDateIntervals, dateIntervalName); 
     } 
     ... 
} 

不幸的是我的尝试与失败。

有没有人设法做到这样的成功?

+0

您是否从命令行测试函数?如果是这样的话,你用那里的'[*]'来测试它吗?(或者解析器是否为你添加了这个?) –

+0

不幸的是,H2不支持区间数据类型,所以'INTERVAL 1 DAY'不被理解。 –

+0

解析器添加了语法错误发生处的'[*]'。 –

回答

2

以供将来参考,直到H2决定增加对间隔数据类型的支持(这是在他们的待办事项列表)

看来,目前唯一的选择就是使用替代功能:
在此刻

TIMESTAMPADD(unquotedPeriodName, -1, :date)

提供了非常相似的功能,所以这就是我将使用。