2011-07-26 16 views
9

Estoy escribiendo una prueba de integración en Grails usando GORM.Probando la función to_date de Oracle

quiero hacer algo como lo siguiente:

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

pero me da el siguiente error:

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

creo que el error se debe a la base de datos en la memoria utilizada por GORM (es es H2?) que no admite la función to_date.

¿Alguna idea sobre cómo escribir el SQL de eliminación para que funcione en una prueba y en vivo?

Como realmente solo me importa el mes y el año que pensé que tendría sería borrar los registros donde la fecha_estad es entre la primera y la última fecha del mes dado.

¿Puede alguien pensar en una mejor manera?

Respuesta

6

Sí, H2 no admite TO_DATE, está en 1.4.x roadmap. En su lugar, puede usar la función EXTRACT que existe tanto en Oracle DB como en H2.

+0

Excelente, esto ha funcionado muy bien, gracias por el puntero. – C0deAttack

3

O puede definir su propio TO_DATE como

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

ver http://www.h2database.com/html/features.html#user_defined_functions

24

Esto todavía aparece como número 1 en las búsquedas de Google así que aquí es lo que funcionó para mí.

Mis pruebas de unidad/entorno local crean y rellenan un esquema utilizando archivos sql. He creado el siguiente alias en el archivo 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); 
} 
'; 

Aviso el uso de comillas simples en lugar de $$ en h2 user defined functions ya que es el único formato que funcionó para mí.

+0

No soy el autor, pero diría que esta es la respuesta correcta. Debido a que la respuesta elegida sugiere modificar el SQL, sin embargo, si usa H2 para las pruebas de Unidad, no cambiará su código para que su caso de prueba funcione. –

6

Tuve que ajustar la respuesta de bluesman para que funcione con los formatos de fecha que se usan comúnmente en Oracle sql.

Esta versión es compatible con dateFormats como '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); 
} 
'; 

me encontré con los consejos de esta entrada del blog http://javatechniques.com/blog/dateformat-and-simpledateformat-examples/ útil para encontrar la manera de traducir los formatos de fecha de Oracle en formatos de 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

considere explicar su código, tratamos de hacer preguntas útiles para todos con un problema similar como sea posible. – LionC

Cuestiones relacionadas