2009-09-01 17 views
28

la definición del campoNo se puede convertir '0000-00-00 00:00:00' a TIMESTAMP

/** Date. */ 
    @Column(columnDefinition = "datetime") 
    private Date date; 

colocador

public void setDate(final Date date) { 
    DateFormat dfmt = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); 
    try { 
     this.date = dfmt.parse(dfmt.format(date)); 
    } catch (ParseException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 

    } 

¿Alguien tiene idea de cómo convertir "fecha cero" en adecuada valor? Porque tengo error:

Cannot convert value '0000-00-00 00:00:00' from column 13 to TIMESTAMP 

E incluso si fijo campo "default" y pionero de la siguiente manera:

/** Date. */ 
     @Column 
     private Date date; 


public void setDate(final Date date) { 
     this.date = date; 
    } 

yo todavía tengo el mismo problema ....

+2

Me parece que 0000-00-00 00:00:00 no corresponde a ningún momento real en el tiempo, y por lo tanto, fundamentalmente no se puede convertir a un valor de marca de tiempo. ¿Cuál es el comportamiento que querías? ¿Desea convertir la fecha ISO no válida en un valor predeterminado? –

+0

el siguiente movimiento después de obtener datos (hay más de una columna en la tabla) de la tabla es escribir esto en XML pero (!) No escribiré el valor de Fecha en XML, así que solo quiero obtener datos de la tabla y después de eso, nunca llamaré al método getDate(). – Oleksandr

+0

"¿Desea convertir la fecha ISO no válida en un valor predeterminado?" - sí, si es posible ... – Oleksandr

Respuesta

63

Voy a adivinar aquí que estás usando MySQL :-) Utiliza "fechas cero" como special placeholder - desafortunadamente, JDBC no puede manejarlas de forma predeterminada.

La solución es especificar "zeroDateTimeBehavior = convertToNull" como parámetro para su conexión MySQL (ya sea en URL fuente de datos o como una propiedad adicional), por ejemplo:

jdbc:mysql://localhost/myDatabase?zeroDateTimeBehavior=convertToNull 

Esto hará que todos esos valores a ser recuperados como NULLs

+1

+1. Tenía el mismo problema. Encontré la misma respuesta. –

+0

Solo una nota al margen: esto convertirá las fechas cero en nulos durante la lectura, pero no convertirá los nulos en ceros durante el guardado. No he encontrado una manera de guardar "0000-00-00" en una base de datos a través de Hibernate. – serg

+0

@ serg555 - tienes razón. Sin embargo, tengo que preguntar: ¿por qué querrías guardar "0000-00-00" en una base de datos? NULLs existen precisamente por esta razón, toda esta abominación "0000-00-00" no es más que dolor. – ChssPly76

3

No entiendo el punto de tu código, donde formateas y luego vuelves a analizar una fecha. Esto parece una operación idéntica. ¿Tal vez podrías elaborar?


Si se quiere dar un valor predeterminado a una fecha, que podría hacer:

/** Jan 1, 1970 ; first moment in time in Java */ 
private static final Date NO_DATE = new Date(0L); 

private Date date; 

public void setDate(final Date date) { 
    if (date == null) { 
     this.date = NO_DATE; 
    } else { 
     this.date = date; 
    } 
} 

Nota: la anotación son optionnal, aquí no añadí ellos.

En este código, puede sustituir lo que desea con la condición y el valor predeterminado.

También podría agregar un setter similar, que tomaría un argumento String, y verificaría su valor especial "00000 ...". Esto permitiría establecer el campo con una Fecha o con una Cadena.

Cuestiones relacionadas