'0000-00-00 00:00:00' no se puede representar como error java.sql.Timestamp


141

Tengo una tabla de base de datos que contiene fechas

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

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 la fecha se asigna automáticamente 0000-00-00 00:00:00 cuando se llama a los datos de la tabla con la columna de la fecha que da error

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

Intenté pasar un valor nulo a la fecha al insertar datos, pero se asigna a la hora actual.

¿Hay alguna forma de obtener el ResultSetsin cambiar la estructura de la tabla?

Respuestas:


302

Puede usar esta URL JDBC directamente en la configuración de su fuente de datos:

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


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

2
¿Sabes si hay un equivalente de MariaDB para agregar a mi URL jdbc? jdbc: mariadb: // localhost: 3306 / dev? zeroDateTimeBehavior = convertToNull no parece funcionar para mí.
jeffkempf

Tenía que ser CONVERT_TO_NULL para mí
routeburn

16

Si la "fecha" '0000-00-00 "es o no una" fecha "válida es irrelevante para la pregunta." Simplemente cambiar la base de datos "rara vez es una solución viable.

Hechos:

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

Entonces, si "solo cambio la base de datos", se romperán miles de líneas de código PHP.

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

Un programador que se conecta a MySQL necesita manejar nulos y 0000-00-00, así como fechas válidas. Cambiar 0000-00-00 a nulo no es una opción viable, porque entonces ya no 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 cambiarlo a ("y", 1), o ("aaaa-MM-dd", 0001-01-01), o en cualquier valor no válido Fecha 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 fechas de MySQL. Y dos errores no lo hacen bien. El hecho es que muchos programadores tendrán que manejar las fechas cero de MySQL para siempre .


9

Agregue la siguiente declaración al 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

55
Ten cuidado con este enfoque. Funciona a las mil maravillas, pero nos quitó un servidor de producción (aunque funcionó perfectamente en desarrollo ...). Lo que hemos aprendido es que tendrá que citar la cadena como el y se interpreta como un carácter especial en algunos contextos que dan la línea de un significado completamente diferente ...
Techmag

6

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

ALTER TABLE table_name MODIFY COLUMN date TIMESTAMP NULL

3

Como respuesta final, cuando no puede hacer una modificación en su columna de fecha o actualizar los valores, o mientras se realizan estas modificaciones, puede hacer una selección utilizando 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;

1

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

SET sql_mode = 'NO_ZERO_DATE';

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


1

puedes intentar así

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

0

No hubo año 0000 ni mes 00 ni día 00. Le sugiero que intente

0001-01-01 00:00:00

Si bien el año 0 se ha definido en algunas normas, es más probable que sea confuso que útil en mi humilde opinión.


2
Sí, hay un año 0000. De hecho, es el año 0 y tenemos un año -1 y un año -1000. Nunca vi este calendario gregoriano o este Anno Domini y, más especialmente, el calendario gregoriano no tiene un año cero, pero la iso sí y la iso se usa en las computadoras ver 0 años
botenvouwer

@sirwilliam Gracias por esa calificación interesante. Parece que el OP quería que el año 0 se tratara como NULL o algo que no existe.
Peter Lawrey

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.
Juha Palomäki


0

Sé que esta será una respuesta tardía, sin embargo, esta es la respuesta más correcta.

En la base de datos MySQL, cambie su timestampvalor predeterminado a CURRENT_TIMESTAMP. Si tiene registros antiguos con el valor falso, deberá corregirlos manualmente.


Esto tampoco ayudará.
Sunil Sharma

0

Puede eliminar la propiedad "no nulo" de su columna en la tabla mysql si no es necesario. cuando elimina la propiedad "no nula" no es necesario realizar la conversión "0000-00-00 00:00:00" y el problema desaparece.

Al menos funcionó para mí.


-2

Creo que esta es una ayuda completa para quienes obtienen esto a continuación Excepción sobre el bombeo de datos a través de logstash Error: logstash.inputs.jdbc - Excepción al ejecutar la consulta JDBC {: excepción => #}

Respuesta: jdbc: mysql: // localhost: 3306 / database_name? ZeroDateTimeBehavior = convertToNull "

o si estás trabajando con mysql

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.