2011-07-26 69 views
9

我正在使用GORM編寫Grails中的集成測試。測試Oracle to_date函數

我想要做的東西像下面這樣:

delete from Statistic 
where stat_date = TO_DATE(:month_year, 'MON-YYYY') 

,但我得到了以下錯誤:

java.sql.SQLException: Unexpected token: TO_DATE in statement [delete from statistics where stat_date=TO_DATE(?, 'MON-YYYY')]

我認爲錯誤是由GORM使用的內存數據庫引起的(是它H2?)不支持to_date函數。

關於如何編寫刪除SQL以使其在測試和實時中起作用的任何想法?

因爲我真的只關心月份和年份,我認爲我會刪除stat_date在給定月份的第一個和最後一個日期之間的記錄。

任何人都可以想出更好的方法嗎?

回答

6

是的,H2不支持TO_DATE,它在1.4.x roadmap。相反,您可以使用Oracle DB和H2中存在的EXTRACT函數。

+0

非常好,這個工作得很好,謝謝指針。 – C0deAttack

3

或者你可以這樣定義

CREATE ALIAS TO_DATE AS $$ 
java.util.Date to_date(String value, String format) throws java.text.ParseException { 

java.text.DateFormat dateFormat = new java.text.SimpleDateFormat(format); 
    return dateFormat.parse(value); 
} 
$$; 

自己TO_DATE看到http://www.h2database.com/html/features.html#user_defined_functions

24

這仍然出來作爲對谷歌1號搜索所以這裏是爲我工作。

我的單元測試/本地環境使用sql文件構建和填充模式。我在sql文件

-- TO_DATE 
drop ALIAS if exists TO_DATE; 
CREATE ALIAS TO_DATE as ' 
import java.text.*; 
@CODE 
java.util.Date toDate(String s, String dateFormat) throws Exception { 
    return new SimpleDateFormat(dateFormat).parse(s); 
} 
'; 

注意在h2 user defined functions使用單引號代替$$的,因爲這是隻爲我工作的格式創建了以下的別名。

+0

我不是作者,但我會說這是正確的答案。因爲選擇的答案建議修改SQL,但是,如果使用H2進行單元測試,則不會更改代碼以使測試用例正常工作。 –

6

我不得不調整bluesman的答案,以使它適用於我們的Oracle sql中常用的日期格式。

此版本支持像「DD-MON-YYYY」

-- TO_DATE 
drop ALIAS if exists TO_DATE; 
CREATE ALIAS TO_DATE as ' 
import java.text.*; 
@CODE 
java.util.Date toDate(String s, String dateFormat) throws Exception { 
    if (dateFormat.contains("MON")) { 
     dateFormat = dateFormat.replace("MON", "MMM"); 
    } 
    if (dateFormat.contains("Y")) { 
     dateFormat = dateFormat.replaceAll("Y", "y"); 
    } 
    if (dateFormat.contains("D")) { 
     dateFormat = dateFormat.replaceAll("D", "d"); 
    } 
    return new SimpleDateFormat(dateFormat).parse(s); 
} 
'; 

的DateFormats我找到了技巧上的這篇博客http://javatechniques.com/blog/dateformat-and-simpledateformat-examples/搞清楚如何翻譯的Oracle日期格式轉換成的SimpleDateFormat的格式幫助。

5
java.util.Date toDate(String dateTime, String dateFormat) throws Exception { 
    if (dateFormat.contains("MON")) { 
     dateFormat = dateFormat.replace("MON", "MMM"); 
    } 
    if (dateFormat.contains("Y")) { 
     dateFormat = dateFormat.replaceAll("Y", "y"); 
    } 
    if (dateFormat.contains("D")) { 
     dateFormat = dateFormat.replaceAll("D", "d"); 
    } 
    if (dateFormat.contains("HH")) { 
     dateFormat = dateFormat.replaceAll("HH", "hh"); 
    } 
    if (dateFormat.contains("hh24")) { 
     dateFormat = dateFormat.replaceAll("hh24", "hh"); 
    } 
    if (dateFormat.contains("MI") || dateFormat.contains("mi")) { 
     dateFormat = dateFormat.replaceAll("MI", "mi").replaceAll("mi", "mm"); 
    } 
    if (dateFormat.contains("SS")) { 
     dateFormat = dateFormat.replaceAll("SS", "ss"); 
    } 
    return new SimpleDateFormat(dateFormat).parse(dateTime); 
} 
+0

考慮解釋你的代碼,我們嘗試儘可能地爲每個人提供類似問題的問題。 – LionC