IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

avec Java Discussion :

Troncature de date entre java.until.Date et java.sql.Date


Sujet :

avec Java

  1. #1
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2017
    Messages
    18
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2017
    Messages : 18
    Par défaut Troncature de date entre java.until.Date et java.sql.Date
    Bonjour à tous,

    j'ai un souci concernant des dates dans mon application java.

    Contexte:

    j'ai une BDD Mysql ou les champs DebutDeValidite et FinDeValidite sont au format Date ("yyyy-MM-dd").

    Quand je souhaite lister les objets, j'ai aucun souci, je récupère les dates au format ("yyyy-MM-dd") que je formate via DateFormat en ("dd-MM-yyyy").
    Jusque la tout va bien.

    Quand je souhaite insérer un nouvel objets dans ma base de données, je fait donc le circuit inverse.

    Je récupère le champs debutDeValidite via son accesseur (type String), que je passe au DateFormat en ("yyyy-MM-dd") pour qu'il soit au bon format date de Mysql.

    Mon problème:

    Pour l'insertion, j'utilise un PreparedStatement qui demande pour la methode preparedStatement.setDate() un java.sql.Date et non un java.until.Date.
    C'est ici que tout capote.

    Voici un code d'exemple ou debutDeValidite est remplacé par une autre date au format String:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
                                    DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");	
    			        String date ="21-02-1989";
    				java.until.Date uneDate = dateFormat.parse(date);			
    				java.sql.Date sqlDate = new java.sql.Date(uneDate.getTime());
                                    System.out.println(date);
    				System.out.println(uneDate);
    		                System.out.println(sqlDate);
    La sortie :

    21-02-1989
    Sat Jul 13 00:00:00 CET 26
    0026-07-13


    Je ne comprends pas pourquoi le DateFormat fait tout capoter.

    Si quelqu'un pourrai m'aider svp?

    Bien à vous,

  2. #2
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 582
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 582
    Par défaut
    Hello,

    Sérieusement, tu ne comprends pas pourquoi ça cloche entre "yyyy-MM-dd" et "21-02-1989" ?

    Tu es vraiment, vraiment sûr que tu ne vois pas ce qui colle pas entre les deux ?
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  3. #3
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2017
    Messages
    18
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2017
    Messages : 18
    Par défaut
    Merci de ta réponse.

    Je vais changer le format des dates en SQL.

    Bonne journée.

  4. #4
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 582
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 582
    Par défaut
    ?????

    Pour quoi faire ?

    Ça a juste aucun rapport avec le problème dont tu nous parles, tu sais.

    Tu as besoin de transformer la chaîne "21-02-1989" en un objet java.sql.Date qui représente le 21 Février 1989. Aucun besoin de toucher à quoi que ce soit de SQL pour faire ça.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  5. #5
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2017
    Messages
    18
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2017
    Messages : 18
    Par défaut
    Salut,

    je voulais passer au SQL car cela fait 3 jours que je me prends la tête avec les dates en Java.

    Je t'explique:

    j'ai deux champs String dans une JTable qui représentent des dates qui sont sous la forme 21-02-1989 mais dans ma BDD la forme des dates est 1989-02-21.

    C'est la que je coince. J'arrive à créer une variable de type date mais elle représente en effet littéralement le 21 février 1989 ou Sat Jul 13 00:00:00 CET 26 (date fausse c'était juste pour l'exemple).

    Etant en Java 8, j'ai également utilisé:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    			String pattern = "dd-MM-yyyy";				
    				DateTimeFormatter dTF = DateTimeFormatter.ofPattern(pattern, Locale.FRENCH);
    				LocalDate date = LocalDate.parse(unOutil.getDebutDeValidite(), dTF);
    Mais cela ne fonctionne pas également.

    Voila pourquoi j'étais parti sur du sql STR_TO_DATE

    Si tu as des conseils.

    Bien à vous.

  6. #6
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 582
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 582
    Par défaut
    Mon conseil c'est de faire des petites étapes et de faire un peu confiance à l'évidence d'abord, et ensuite seulement chercher plus loin si ça ne va pas.

    Le problème que tu avais, c'est :

    Tu as une String, "21-02-1989" et tu veux la transformer en un objet java.sql.Date qui représente le 21 Février 1989. Et cette conversion ne donne pas la bonne date en utilisant le pattern "yyyy-MM-dd".

    Pourquoi ? Eh bien parce que "yyyy-MM-dd" ce n'est pas le bon pattern pour "21-02-1989".

    Il fallait utiliser "dd-MM-yyyy" comme le dicte l'évidence pure et simple. C'est tout. Ça a toujours été aussi simple que ça.

    Tu nous parles de SQL, mais SQL n'a rien à voir là-dedans, il ne fait pas partie de cette étape. Il n'y avait aucune raison de penser à SQL tant que tu n'avais pas résolu cette étape qui ne touche pas à SQL.

    Mais cela ne fonctionne pas également.
    Dire "ça ne fonctionne pas" est inutile. D'ailleurs si tout allait bien pour toi tu ne serais pas ici. Le fait que tu sois ici est suffisant pour qu'on sache que tu as un problème. Donc si tu estimes que tu dois donner d'autres informations, tu as sûrement raison, mais ce n'était pas ça.

    Il faut dire "voici ce qui arrive : <description exacte et complète de ce qui arrive> alors que moi je voulais ceci : <description exacte et complète de ce que tu voulais>"
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  7. #7
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2017
    Messages
    18
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2017
    Messages : 18
    Par défaut
    Bonjour et merci thelvin pour ton dernier message.

    Après un long weekend et quels tests, je suis arrivé à convertir la Date util en Date sql.

    Mais j'ai un autre souci, jdbc me dit que la valeur de la date est incorrecte. Pourtant quand j'affiche la variable dans les logs, j'ai le même format que celui de Mysql, et la bonne date au format yyyy-MM-dd.

    Voici le code de la requête et d'affichage dans les logs:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
     
    String requete = "INSERT INTO outils (atelier,site,affectation,designation,constructeur,type,numserie,identification,debutDeValidite,etat,pas,findevalidite,verification,categorie,observation) "
    					+ "VALUES(?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)";
    				SimpleDateFormat  formatter = new SimpleDateFormat("dd-MM-yyyy");
    				try {
    					java.util.Date dateJ = formatter.parse(unOutil.getDebutDeValidite());
    					java.sql.Date dateS = new java.sql.Date(dateJ.getTime());
    					System.out.println(dateS);
     
    				PreparedStatement pS =  (PreparedStatement) this.getConnexion().prepareStatement(requete);			
    				pS.setString(1, unOutil.getAtelier().trim().toUpperCase());
    				pS.setString(2, unOutil.getSite().trim().toUpperCase());
    				pS.setString(3, unOutil.getAffectation().trim().toUpperCase());
    				pS.setString(4, unOutil.getDesignation().trim().toUpperCase());
    				pS.setString(5, unOutil.getConstructeur().trim().toUpperCase());
    				pS.setString(6, unOutil.getType().trim().toUpperCase());
    				pS.setString(7, unOutil.getNumSerie().trim().toUpperCase());
    				pS.setString(8, unOutil.getIdentification().trim().toUpperCase());
    				pS.setDate(9, dateS);
    				pS.setString(10, unOutil.getEtat().trim().toUpperCase());
    				pS.setInt(11, unOutil.getPas());
    				pS.setDate(12, dateS);
    				pS.setString(13, unOutil.getVerification().trim().toUpperCase());
    				pS.setString(14, unOutil.getCategorie().trim().toUpperCase());
    				pS.setString(15, unOutil.getObservation().trim().toUpperCase());
     
    				if(pS.executeUpdate() == 1)
    				{
    					rep = true;
    				}
    			} catch (Exception e) {
    				e.printStackTrace();
    			}
    			return rep;
    Voici une image de unOutil.getDebutDeValidite() au format date sql après le traitement.

    Nom : Capture.PNG
Affichages : 274
Taille : 831 octets

    Voici le code de l’exception levée:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    com.mysql.jdbc.MysqlDataTruncation: Data truncation: Incorrect date value: '' for column 'debutDeValidite' at row 1
    Bien à vous.

  8. #8
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 582
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 582
    Par défaut
    Je n'ai pas de BDD MySQL sous la main pour vérifier, mais je trouve très étrange qu'il se plaigne que tu lui donnes une chaîne vide comme date en disant '', alors que tu lui donnes une date non-null avec PreparedStatement.setDate()

    En fait, je pense plutôt que l'erreur que tu nous montres, n'est pas provoquée avec le code que tu nous montres. Mais avec un autre, différent de celui-là. Parce que tu l'as changé avant ou après cette erreur, ça j'en sais rien, et que tu as obtenu une autre erreur que celle-ci avant ou après, ça j'en sais rien.

    Ça donne quoi si tu ajoutes la ligne

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    System.out.println("###### OUI ON UTILISE BIEN PreparedStatement.setDate() ##########");
    juste devant la ligne

    ?
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  9. #9
    Membre Expert
    Avatar de yotta
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Septembre 2006
    Messages
    1 088
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2006
    Messages : 1 088
    Par défaut Une petite idée
    Bonjour,
    J'ai pas mal manipulé de dates avec Java et MySQL. J'ai fini par modifier le type de champs côté MySQL en Timestamp, quitte à faire abstraction de l'heure lorsque seule la date m’intéresse. En tous cas, après avoir passé le type en timestamp dans MySQL, plus aucun problème de date...
    C'est une idée...
    Une technologie n'est récalcitrante que par ce qu'on ne la connait et/ou comprend pas, rarement par ce qu'elle est mal faite.
    Et pour cesser de subir une technologie récalcitrante, n'hésitez surtout pas à visiter les Guides/Faq du site !

    Voici une liste non exhaustive des tutoriels qui me sont le plus familiers :
    Tout sur Java, du débutant au pro : https://java.developpez.com/cours/
    Tout sur les réseaux : https://reseau.developpez.com/cours/
    Tout sur les systèmes d'exploitation : https://systeme.developpez.com/cours/
    Tout sur le matériel : https://hardware.developpez.com/cours/

Discussions similaires

  1. Problème de format date entre mysql et netbeans java
    Par silissou dans le forum Requêtes
    Réponses: 2
    Dernier message: 31/07/2012, 14h09
  2. Probleme de date entre sql est java
    Par logiciel_const dans le forum SQL
    Réponses: 7
    Dernier message: 31/01/2011, 11h20
  3. difference entre java.sql.Date et java.util.Date
    Par ErEcTuS dans le forum Collection et Stream
    Réponses: 1
    Dernier message: 06/05/2009, 09h48
  4. Réponses: 10
    Dernier message: 26/11/2008, 18h13
  5. Conflit entre java.util.Date et class java.sql.Date
    Par vonitiana dans le forum Langage
    Réponses: 3
    Dernier message: 30/06/2006, 11h43

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo