‘0000-00-00 00:00:00’ ne peut pas être représenté comme erreur java.sql.Timestamp

J’ai une table de firebase database contenant des dates

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

J’utilise MySQL. Dans le programme, des données sont parfois transmises sans la date à la firebase database. Ainsi, la valeur de date est atsortingbuée automatiquement à 0000-00-00 00:00:00 lorsque les données de la table sont appelées avec la colonne de date

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

J’ai essayé de transmettre une valeur nulle à la date lors de l’insertion de données, mais elle est affectée à l’heure actuelle.

Est-il possible d’obtenir le ResultSet sans modifier la structure de la table?

Merci d’avance

Vous pouvez utiliser cette URL JDBC directement dans votre configuration de source de données:

jdbc: mysql: // votre serveur: 3306 / votre firebase database? zeroDateTimeBehavior = convertToNull

Que la “date” soit “0000-00-00” soit une “date” valide ne concerne pas la question. “Il suffit de changer la firebase database” est rarement une solution viable.

Faits:

  • MySQL permet une date avec la valeur de zéros.
  • Cette “fonctionnalité” est largement utilisée avec d’autres langues.

Donc, si je “change juste la firebase database”, des milliers de lignes de code PHP seront cassées.

Les programmeurs Java doivent accepter la date zéro de MySQL et ils doivent remettre une date zéro dans la firebase database, lorsque d’autres langages s’appuient sur cette “fonctionnalité”.

Un programmeur qui se connecte à MySQL doit gérer les dates nulles et 0000-00-00 ainsi que les dates valides. Changer 0000-00-00 à null n’est pas une option viable, car vous ne pouvez plus déterminer si la date était censée être 0000-00-00 pour la réécriture dans la firebase database.

Pour 0000-00-00, je suggère de vérifier la valeur de la date sous forme de chaîne, puis de la remplacer par (“y”, 1), ou (“aaaa-MM-jj”, 0001-01-01), ou toute autre valeur invalide. MySQL date (moins de 1000 ans, iirc). MySQL a une autre “fonctionnalité”: les dates basses sont automatiquement converties en 0000-00-00.

Je me rends compte que ma suggestion est un kludge. Mais la gestion des dates de MySQL l’est aussi. Et deux kludges ne vont pas bien. Le fait est que de nombreux programmeurs devront gérer les dates zéro de MySQL pour toujours .

Au lieu d’utiliser de fausses dates comme 0000-00-00 00:00:00 ou 0001-01-01 00:00:00 (ce dernier doit être accepté car il s’agit d’une date valide), modifiez votre schéma de firebase database pour autoriser les valeurs NULL .

 ALTER TABLE table_name MODIFY COLUMN date TIMESTAMP NULL 

Ajoutez la déclaration suivante au protocole JDBC-mysql:

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

par exemple:

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

En tant que délai supplémentaire, lorsque vous ne pouvez pas modifier votre colonne de date ou mettre à jour les valeurs, ou que ces modifications ont lieu, vous pouvez effectuer une sélection en utilisant une casse / quand.

 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; 

J’ai lutté avec ce problème et implémenté la solution de concaténation d’URL apscope par @Kushan dans la réponse acceptée ci-dessus. Cela a fonctionné dans mon instance MySql locale. Mais lorsque j’ai déployé mon application Play / Scala sur Heroku, cela ne fonctionnerait plus. Heroku concatène également plusieurs arguments à l’URL de firebase database qu’ils fournissent aux utilisateurs, et cette solution, en raison de la concaténation de «?» Par Heroku. avant leur propre ensemble d’arguments, ne fonctionnera pas. Cependant, j’ai trouvé une solution différente qui semble fonctionner aussi bien.

 SET sql_mode = 'NO_ZERO_DATE'; 

Je mets ceci dans mes descriptions de table et il a résolu le problème de ‘0000-00-00 00:00:00’ ne peut pas être représenté comme java.sql.Timestamp

vous pouvez essayer comme ça

 ArrayList dtlst = new ArrayList(); Ssortingng qry1 = "select dt_tracker from gs"; Statement prepst = conn.createStatement(); ResultSet rst = prepst.executeQuery(qry1); while(rst.next()) { Ssortingng dt = ""; try { dt = rst.getDate("dt_tracker")+" "+rst.getTime("dt_tracker"); } catch(Exception e) { dt = "0000-00-00 00:00:00"; } dtlst.add(dt); } 

Il n’y avait pas d’année 0000 et il n’y a pas de mois 00 ou jour 00. Je vous suggère d’essayer

 0001-01-01 00:00:00 

Alors qu’une année 0 a été définie dans certaines normes, il est plus probable que cela soit déroutant que celui qui est utile à mon humble avis.

il suffit de lancer le champ en tant que caractère

Ex: lancer (mettre à jour) en tant que caractère mis à jour

Je sais que cela va être une réponse tardive, mais voici la réponse la plus correcte.

Dans la firebase database MySQL, modifiez votre valeur par défaut d’ timestamp dans CURRENT_TIMESTAMP . Si vous avez d’anciens enregistrements avec la valeur fausse, vous devrez les corriger manuellement.

Vous pouvez supprimer la propriété “not null” de votre colonne dans la table mysql si ce n’est pas nécessaire. lorsque vous supprimez la propriété “not null” pas besoin de “0000-00-00 00:00:00” conversion et le problème est parti.

Au moins travaillé pour moi.

Je crois que c’est une aide complète pour qui fait passer ceci ci-dessous. Exception sur le pompage de données via logstash Erreur: logstash.inputs.jdbc – Exception lors de l’exécution de la requête JDBC {: exception => #}

Réponse: jdbc: mysql: // localhost: 3306 / nom_firebase database? ZeroDateTimeBehavior = convertToNull ”

ou si vous travaillez avec mysql