2015-11-30 50 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)

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