2011-07-26 25 views
9

Piszę test integracji w Grails przy użyciu GORM.Testowanie funkcji Oracle to_date

chcę zrobić coś jak następuje:

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

Ale pojawia się następujący błąd:

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

Myślę, że błąd jest spowodowany w pamięci bazy danych używanej przez GORM (jest to H2?) nie wspiera funkcji to_date.

Jakieś pomysły dotyczące pisania instrukcji SQL usuwania, aby działał w teście i na żywo?

Ponieważ naprawdę zależy mi tylko na Miesiącu i Roku, pomyślałem, że będę musiał usunąć zapisy, w których data_data jest między pierwszą a ostatnią datą danego miesiąca.

Czy ktoś może wymyślić lepszy sposób?

Odpowiedz

6

Tak, H2 nie obsługuje TO_DATE, jest to 1.4.x roadmap. Zamiast tego możesz użyć funkcji EXTRACT, która istnieje zarówno w Oracle DB, jak i H2.

+0

Doskonale, to zadziałało bardzo dobrze, dzięki za wskazówkę. – C0deAttack

3

Można też zdefiniować własne TO_DATE jak

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

zobaczyć http://www.h2database.com/html/features.html#user_defined_functions

24

to wciąż pojawia się jako numer 1 na google wyszukuje tak oto co pracował dla mnie.

Moje testy jednostkowe/lokalne budują i zapełniają schemat przy użyciu plików sql. I stworzył następującą alias w pliku 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); 
} 
'; 

Zauważ użycie pojedynczych cudzysłowów zamiast $$ w h2 user defined functions jako że jest to jedyny format, który pracował dla mnie.

+0

Nie jestem autorem, ale powiedziałbym, że to jest poprawna odpowiedź. Ponieważ wybrana odpowiedź sugeruje modyfikację SQL, jednak jeśli używasz H2 do testów jednostkowych, nie zmienisz kodu, aby sprawdzenie testu działało. –

6

Musiałem dostosować odpowiedź bluesmana, aby działało z formatami dat, które są powszechnie używane w naszym SQL sql.

Ta wersja obsługuje dateFormats jak „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); 
} 
'; 

znalazłem wskazówki na temat tego blogu http://javatechniques.com/blog/dateformat-and-simpledateformat-examples/ pomocne w zastanawianie się, jak przełożyć formatów daty Oracle w formatach SimpleDateFormat za.

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

rozważ wyjaśnienie swojego kodu, postaramy się, aby pytania były tak samo przydatne dla wszystkich osób z podobnym problemem, jak to tylko możliwe. – LionC

Powiązane problemy