2011-07-26 26 views
9

GORM kullanarak Grails uygulamasında bir entegrasyon testi yazıyorum.Oracle to_date işlevinin sınanması

aşağıdaki gibi bir şey yapmak istiyorum:

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

Ama aşağıdaki hatayı alıyorum:

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

hata Gorm tarafından kullanılan bellekte veritabanına kaynaklanır düşünüyorum (olduğu Bu H2?) to_date işlevini desteklemiyor.

SQL'in nasıl silineceği ile ilgili herhangi bir fikir, bir sınamada ve canlı olarak çalışacak şekilde nasıl?

Sadece Ay'ı ve Yılı önemsediğimden, stat_date'in belirtilen ayın ilk ve son tarihi arasında olduğu kayıtları silmem gerektiğini düşündüğüm biri.

Herhangi biri daha iyi bir yol düşünebilir mi?

cevap

6

Evet, H2 TO_DATE'yi desteklemiyor, 1.4.x roadmap numaralı telefondan. Bunun yerine, hem Oracle DB hem de H2'de bulunan EXTRACT işlevini kullanabilirsiniz.

+0

Mükemmel, bu çok iyi çalıştı, işaretçi için teşekkürler. – C0deAttack

3

Yoksa

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

gibi kendi TO_DATE tanımlayabilirsiniz Bu hala google 1 numara olarak çıkageldi işte arar benim için çalıştı ne http://www.h2database.com/html/features.html#user_defined_functions

24

görüyoruz.

Ünite sınamaları/yerel ortam sql dosyaları kullanarak bir şema oluşturup doldurur. Ben sql dosyası

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

Bildirim o benim için çalışan tek biçimdir olarak h2 user defined functions yerine $$ tek tırnak kullanımı aşağıdaki takma yarattı.

+0

Yazar değilim ama bu doğru cevap olduğunu söyleyebilirim. Seçtiğiniz cevap SQL'i değiştirmeyi önerdiğinden, testler için H2 kullanıyorsanız, test durumunuzun çalışması için kodunuzu değiştirmeyeceksiniz. –

6

Sık sık Oracle sql'de kullanılan tarih biçimleri için çalışmasını sağlamak için bluesman'ın yanıtını ayarlamak zorunda kaldım.

Bu sürüm ben SimpleDateFormat en biçimlere Oracle tarih biçimlerini nasıl çevireceklerini bulmaktan http://javatechniques.com/blog/dateformat-and-simpledateformat-examples/ bu blog yayınında ipuçları bulmuş 'GG-AY-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); 
} 
'; 

gibi dateFormats destekler.

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

kodunuzu açıklamayı düşünürsek, olabildiğince benzer bir sorunu olan herkes için yararlı sorular sormaya çalışırız. – LionC