web-dev-qa-db-fra.com

'0000-00-00 00:00:00' ne peut pas être représenté par l'erreur Java.sql.Timestamp

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. Parfois, les données du programme sont transmises sans date à la base de données. Ainsi, la valeur de la 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, cela donne une erreur

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

J'ai essayé de passer la valeur null à la date lors de l'insertion de données, mais celle-ci est assignée à l'heure actuelle.

Est-il possible d'obtenir la ResultSet sans changer la structure de la table?

131

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

266
Kushan

Que la "date" '0000-00-00 "soit ou non une" date "valide n'a pas d'importance pour la question ." Il suffit de changer de base de données "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 "ne change que la base de données", des milliers de lignes de code PHP se briseront.

Les programmeurs Java doivent accepter la date zéro de MySQL et ils doivent indiquer une date zéro dans la base de données, lorsque les autres langages utilisent cette "fonctionnalité".

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

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 par toute autre valeur non valide. Date MySQL (moins de l'an 1000, 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 le traitement de la date par MySQL est tout aussi… .. Et deux kludges ne le corrigent pas. Le fait est que beaucoup de programmeurs devront gérer les dates zéro de MySQL pour toujours .

12
UnlimitedInfinity

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
6
Yogesh H Bhosale

Au lieu d'utiliser de fausses dates telles que 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 base de données pour autoriser les valeurs NULL.

ALTER TABLE table_name MODIFY COLUMN date TIMESTAMP NULL
6
npe

Dans les cas extrêmes, 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;
3
VCeron

vous pouvez 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);
}
1
13hola

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 locale MySql. 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 base de données qu'ils fournissent aux utilisateurs, et à cette solution, en raison de la concaténation par Heroku de "?" avant leurs propres 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 cela dans la description de mon tableau et cela résout le problème de '0000-00-00 00:00:00' ne peut pas être représenté par Java.sql.Timestamp

1
Aqume

il suffit de lancer le champ comme personnage

Par exemple: cast (updatedate) as char comme updatedate

0

Il n'y avait pas d'année 0000 ni de mois 00 ni de jour 00. Je vous suggère d'essayer 

0001-01-01 00:00:00

Bien qu'une année 0 ait été définie dans certaines normes, elle est plus susceptible de prêter à confusion que d'être utile.

0
Peter Lawrey

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 null", il n'est pas nécessaire de convertir "0000-00-00 00:00:00" et le problème a disparu.

Au moins a fonctionné pour moi.

0
Celik

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

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

0
PeakGen