2011-07-26 20 views
9

GORMを使用してGrailsで統合テストを作成しています。Oracleのto_date関数のテスト

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

しかし、私は次のエラーを取得:私は、次のような何かをしたい

私は(エラーがGORMで使用されるメモリ内のデータベースに起因していると思い

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

をされますそれは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を定義することができます。これは、まだGoogleで番号1として起動しますので、ここで検索し、私のために働いたものだhttp://www.h2database.com/html/features.html#user_defined_functions

24

を参照してください。

私のユニットテスト/ローカル環境では、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); 
} 
'; 

SQLファイルに次のエイリアスを作成していることに注意してくださいが私のために働いていた唯一のフォーマットであるとして h2 user defined functionsで単一引用符の代わりに、$$を使用します。

+0

私は著者ではありませんが、これは正しい答えだと思います。ただし、ユニットテストにH2を使用すると、コードを変更してテストケースを機能させることはできません。 –

6

私たちのOracle sqlでよく使用されている日付フォーマットで動作させるには、ブルーマンの回答を調整する必要がありました。

このバージョンでは、「DD-MON-YYYY」のようなdateFormats

-- 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); 
} 
'; 

をサポートしています私はSimpleDateFormatのの形式にOracle日付フォーマットを変換する方法を考え出すで、このブログの記事http://javatechniques.com/blog/dateformat-and-simpledateformat-examples/のヒントが役に立ったと評価してい。

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