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

141

J'ai une table de base de données contenant des dates

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

J'utilise MySQL. Depuis le programme, les données sont parfois transmises sans date à la base de données. Ainsi, la valeur de date est automatiquement affectée 0000-00-00 00:00:00 lorsque les données de la table sont appelées avec la colonne de date qui génère une erreur

...'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 attribuée à l'heure actuelle.

Existe-t-il un moyen d'obtenir le ResultSetsans changer la structure de la table?

Chamila Adhikarinayake
la source

Réponses:

302

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

jdbc: mysql: // votre serveur: 3306 / votre base de données? zeroDateTimeBehavior = convertToNull

Kushan
la source
2
curieuse. En lisant les autres réponses, duh, il n'y a pas de mois zéro. Qu'est-ce que cela signifie vraiment?
Thufir
2
Savez-vous s'il existe un équivalent MariaDB à ajouter à mon URL jdbc? jdbc: mariadb: // localhost: 3306 / dev? zeroDateTimeBehavior = convertToNull ne semble pas fonctionner pour moi.
jeffkempf
Dû être CONVERT_TO_NULL pour moi
routeburn
16

Que la "date" "0000-00-00" soit ou non une "date" valide n'a aucun rapport avec la question. "Il suffit de changer la base de données" est rarement une solution viable.

Les faits:

  • MySQL autorise une date avec la valeur de zéros.
  • Cette "fonctionnalité" est largement utilisée avec d'autres langues.

Donc, si je "change juste la base de données", des milliers de lignes de code PHP vont casser.

Les programmeurs Java doivent accepter la date zéro MySQL et ils doivent remettre une date zéro dans la base de données, lorsque d'autres langages s'appuient sur cette «fonctionnalité».

Un programmeur se connectant à MySQL doit gérer les valeurs null et 0000-00-00 ainsi que les dates valides. Changer 0000-00-00 en null n'est pas une option viable, car vous ne pouvez plus déterminer si la date devait être 0000-00-00 pour la réécriture dans la base de données.

Pour 0000-00-00, je suggère de vérifier la valeur de la date sous forme de chaîne, puis de la changer en ("y", 1), ou ("yyyy-MM-dd", 0001-01-01), ou en une valeur non valide Date MySQL (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 il en va de même pour la gestion des dates de MySQL. Et deux kludges ne font pas les choses correctement. Le fait est que de nombreux programmeurs devront gérer les dates zéro MySQL pour toujours .

IllimitéInfini
la source
9

Ajoutez l'instruction 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
Yogesh H Bhosale
la source
5
Soyez prudent avec cette approche. Cela fonctionne à merveille mais cela a détruit un serveur de production sur nous (a parfaitement fonctionné en dev cependant ...). Ce que nous avons appris, c'est que vous devrez citer la chaîne car le & est interprété comme un caractère spécial dans certains contextes, donnant à la ligne une signification complètement différente ...
Techmag
6

Au lieu d'utiliser de fausses dates comme 0000-00-00 00:00:00ou 0001-01-01 00:00:00(cette dernière doit être acceptée car il s'agit d'une date valide), modifiez le schéma de votre base de données pour autoriser les NULLvaleurs.

ALTER TABLE table_name MODIFY COLUMN date TIMESTAMP NULL
npe
la source
3

En guise de retournement supplémentaire, lorsque vous ne pouvez pas modifier votre colonne de date ou mettre à jour les valeurs, ou pendant que ces modifications ont lieu, vous pouvez effectuer une sélection en utilisant un cas / 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;
VCeron
la source
1

J'ai lutté avec ce problème et mis en œuvre la solution de concaténation d'URL fournie 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 fonctionnait plus. Heroku concatène également plusieurs arguments à l'URL de base de données qu'ils fournissent aux utilisateurs, et cette solution, en raison de la concaténation d'utilisation de Heroku de "?" 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';

J'ai mis cela dans mes descriptions de table et cela a résolu le problème de '0000-00-00 00:00:00' ne peut pas être représenté comme java.sql.

Aqume
la source
1

tu peux essayer comme ça

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);
}
13hola
la source
0

Il n'y avait pas d'année 0000 et il n'y a pas de mois 00 ni de 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, elle est plus susceptible d'être déroutante qu'utile à mon humble avis.

Peter Lawrey
la source
2
Oui, il y a une année 0000. en fait son année 0 et nous avons une année -1 et une année -1000. Jamais vu ce calendrier grégorien ou cet Anno Domini et plus particulièrement le calendrier grégorien n'a pas une année zéro mais l'iso a et l'iso est utilisé par les ordinateurs voir 0 année
botenvouwer
@sirwilliam Merci pour cette qualification intéressante. Il semble que l'OP voulait que l'année 0 soit traitée comme un NULL ou quelque chose qui n'existe pas.
Peter Lawrey
1
Dans MySQL 0000-00-00 00:00:00 est égal à 0. Dans le code hérité, il peut y avoir des requêtes qui reposent sur cela.
Juha Palomäki
0

il suffit de lancer le champ en char

Par exemple: cast (updatedate) en tant que char as updatedate

Santhosh Rajkumar
la source
0

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

Dans la base de données MySQL, modifiez votre timestampvaleur par défaut en CURRENT_TIMESTAMP. Si vous avez d'anciens enregistrements avec la fausse valeur, vous devrez les corriger manuellement.

Jus de citron
la source
cela n'aidera pas non plus.
Sunil Sharma
0

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é "non nulle", pas besoin de conversion "0000-00-00 00:00:00" et le problème a disparu.

Au moins travaillé pour moi.

Celik
la source
-2

Je crois que c'est une aide complète pour ceux qui obtiennent 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 / database_name? ZeroDateTimeBehavior = convertToNull "

ou si vous travaillez avec mysql

sambasivareddy
la source