2012-06-21 40 views
115

Tengo una tabla de base de datos que contiene las fechas'0000-00-00 00:00:00' no puede ser representado como un error java.sql.Timestamp

(`date` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00'). 

que estoy usando MySQL. Desde el programa, a veces los datos se pasan sin la fecha a la base de datos. Por lo tanto, el valor de fecha se auto asigna a 0000-00-00 00:00:00 cuando los datos de la tabla se llama con la columna de la fecha en que da error

...'0000-00-00 00:00:00' can not be represented as java.sql.Timestamp....... 

Intenté pasar valor nulo a la fecha en que la inserción de datos, pero se pone asignar a la tiempo actual.

¿Hay alguna manera de obtener la ResultSet sin cambiar la estructura de la tabla

gracias de antemano

Respuesta

234

Se puede utilizar esta URL JDBC directamente en su configuración de origen de datos:

jdbc:mysql://yourserver:3306/yourdatabase?zeroDateTimeBehavior=convertToNull

+0

curioso. Leyendo las otras respuestas, duh, no hay mes cero. ¿Qué significa esto realmente? – Thufir

+15

esto debería ser el predeterminado para el controlador mysql jdbc. – bradvido

+0

Resolvió mi problema. Gracias. –

0

No hubo año 0000 y no hay mes o 00 días 00. Le sugiero que pruebe

0001-01-01 00:00:00 

Si bien se ha definido un año 0 en algunos estándares, es más probable que resulte confuso que útil en mi humilde opinión.

+2

sí, hay un año 0000. de hecho su año 0 y tenemos un año y un año -1 -1000. Nunca vi este [calendario gregoriano] (https://en.wikipedia.org/wiki/Gregorian_calendar) ni este [Anno Domini] (http://en.wikipedia.org/wiki/Before_Christ) y, más especialmente, el calendario gregoriano no tiene un año cero, pero el iso tiene y el iso se usa computadoras bij ver [0 año] (http://en.wikipedia.org/wiki/0_ (año)) – botenvouwer

+0

@sirwilliam Gracias por esa calificación interesante. Parece que OP quería que el año 0 fuera tratado como NULL o algo que no existe. –

+1

En MySQL 0000-00-00 00:00:00 es igual a 0. En el código heredado, puede haber algunas consultas que dependen de esto. –

7

En lugar de usar fechas falsas como 0000-00-00 00:00:00 o 0001-01-01 00:00:00 (esta última debe aceptarse porque es una fecha válida), cambie el esquema de la base de datos para permitir NULL.

ALTER TABLE table_name MODIFY COLUMN date TIMESTAMP NULL 
+0

me fue dada la base de datos. no puedo editarlo pero gracias –

+0

trato de permitir NULL, no funciona! –

1

que luchó con este problema y la solución implementada URL concatenación aportado por @Kushan en la respuesta aceptada anteriormente. Funcionó en mi instancia MySql local. Pero cuando desplegué mi aplicación Play/Scala a Heroku ya no funcionaría. Heroku también concatena varias args a la URL DB que proporcionan a los usuarios, y esta solución, debido a la concatenación del uso de Heroku de "?" antes de su propio conjunto de argumentos, no funcionará. Sin embargo, encontré una solución diferente que parece funcionar igualmente bien.

Pongo esto en mis descripciones de la tabla y se resolvió el problema de '0000-00-00 00:00:00' no se puede representar como java.sql.Timestamp

8

Sea o no la "fecha" '0000-00-00" es una válida 'fecha' es irrelevante para la cuestión . 'Sólo cambia la base de datos' es rara vez una solución viable

Datos:.

  • MySQL aL baja una fecha con el valor de ceros.
  • Esta "característica" tiene un uso generalizado con otros idiomas.

Por lo tanto, si "simplemente cambio la base de datos", se romperán miles de líneas de código PHP.

Los programadores Java deben aceptar la fecha cero y de MySQL que necesitan para volver a poner una fecha cero en la base de datos, cuando otros lenguajes confían en esta "característica".

Un programador que se conecta a MySQL debe manejar null y 0000-00-00, así como fechas válidas. Cambiar de 0000-00-00 a NULL no es una opción viable, porque ya no se puede determinar si se esperaba que la fecha fuera 0000-00-00 para volver a escribir en la base de datos.

Para 0000-00-00, sugiero verificar el valor de la fecha como una cadena, luego cambiarla a ("y", 1), o ("aaaa-MM-dd", 0001-01-01), o en cualquier fecha inválida de MySQL (menos del año 1000, iirc). MySQL tiene otra "característica": las fechas bajas se convierten automáticamente a 0000-00-00.

Me doy cuenta de que mi sugerencia es un error. Pero también lo es el manejo de la fecha de MySQL. Y dos kludges no lo hacen bien. El hecho es que muchos programadores tendrán que manejar MySQL cero fechas para siempre.

5

añada la siguiente instrucción para el protocolo JDBC-mysql:

?zeroDateTimeBehavior=convertToNull&autoReconnect=true&characterEncoding=UTF-8&characterSetResults=UTF-8 

por ejemplo:

jdbc:mysql://localhost/infra?zeroDateTimeBehavior=convertToNull&autoReconnect=true&characterEncoding=UTF-8&characterSetResults=UTF-8 
+1

Tenga cuidado con este enfoque. Funciona como un encanto, pero nos quitó un servidor de producción (funcionó perfectamente en el desarrollo, aunque ...). Lo que aprendimos es que tendrás que citar la cadena, ya que & se interpreta como un carácter especial en algunos contextos, dando a la línea un significado completamente diferente ... – Techmag

3

Como respuesta exteme, cuando no se puede hacer un altar a la columna de fecha o para actualizar los valores, o mientras se llevan a cabo estas modificaciones, puede hacer una selección usando un caso/cuándo.

SELECT CASE ModificationDate WHEN '0000-00-00 00:00:00' THEN '1970-01-01 01:00:00' ELSE ModificationDate END AS ModificationDate FROM Project WHERE projectId=1; 
0

simplemente arrojados al campo como char

Ej: elenco (updatedate) como char como updatedate

0

Sé que esto va a ser una respuesta tardía, sin embargo aquí está la respuesta más correcta.

En la base de datos MySQL, cambie su valor predeterminado timestamp en CURRENT_TIMESTAMP. Si tiene registros antiguos con el valor falso, tendrá que corregirlos manualmente.

-1

Creo que esto es ayudar completo para conseguir que esta por debajo de excepciones en los datos de bombeo a través logstash error: logstash.inputs.jdbc - Excepción al ejecutar la consulta JDBC {: excepción => #}

respuesta: jdbc: mysql: // localhost: 3306/nombre_basedatos zeroDateTimeBehavior = convertToNull"

o si se está trabajando con MySQL

0

se puede quitar el "propiedad no nula" de su columna en la tabla de MySQL si no es necesario?. cuando elimina la propiedad "not null" no necesita la conversión "0000-00-00 00:00:00" y el problema m se ha ido.

Al menos funcionó para mí.

1

se puede tratar como este

ArrayList<String> dtlst = new ArrayList<String>(); 
String qry1 = "select dt_tracker from gs"; 

Statement prepst = conn.createStatement(); 
ResultSet rst = prepst.executeQuery(qry1); 
while(rst.next()) 
{ 
    String dt = ""; 
    try 
    { 
     dt = rst.getDate("dt_tracker")+" "+rst.getTime("dt_tracker"); 
    } 
    catch(Exception e) 
    { 
     dt = "0000-00-00 00:00:00"; 
    } 

    dtlst.add(dt); 
} 
Cuestiones relacionadas