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

MySQL Discussion :

Bugs sur les Dates sur une base de données MySQL


Sujet :

MySQL

  1. #1
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2015
    Messages
    1
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2015
    Messages : 1
    Points : 3
    Points
    3
    Par défaut Bugs sur les Dates sur une base de données MySQL
    Bonjour,

    Je suis étudiant en stage d'informatique, et je dois créer une base de données pour les archives de là où je travail.
    Les archives sont actuellement stockées dans des fichiers Excel (.xls).
    Je récupère grâce à un programme en java toutes les données nécessaires dans ces fichiers Excel, je les stock provisoirement dans des structures et après je les envoie dans ma base de donnée.
    Seulement voilà, dans les fichiers Excel, il y a des dates sous la forme "JJ/MM/AAAA", et quand je les récupère en Java, il sont de la forme "JJ/MM/AA".
    Jusque là pas de soucis.
    J'ai une fonction qui transforme les dates "JJ/MM/AA" en "AA-MM-JJ" pour MySQL.
    Mais quand, dans MySQL, j'insère un tuple avec un date avant 1970, par exemple "67-02-12", MySQL me la transforme en "2067-02-12" (alors qu'il faudrait que ce soit "1967-02-12"). C'est un vrai problème, et je ne comprend pas du tout d'où ça peux venir.

    J'extrais les date des fichiers Excel sous forme de String en Java, car quand je les extrais sous forme de dates, il me change les valeurs des dates, je ne comprend pas non plus pourquoi.

    Si vous avez une idée, voir même une solution, je suis preneur !

    Merci d'avance !

  2. #2
    Membre émérite
    Homme Profil pro
    tripatouilleur de code pour améliorer mon quotidien boulistique
    Inscrit en
    Février 2008
    Messages
    939
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : tripatouilleur de code pour améliorer mon quotidien boulistique
    Secteur : Enseignement

    Informations forums :
    Inscription : Février 2008
    Messages : 939
    Points : 2 287
    Points
    2 287
    Par défaut
    Bonjour

    Questions :
    - pourquoi passer par Java, et ne pas insérer directement les données de xls dans mysql?
    - pourquoi ne pas changer la façon dont java récupère les dates xls?
    Je cite :
    dans les fichiers Excel, il y a des dates sous la forme "JJ/MM/AAAA", et quand je les récupère en Java, il sont de la forme "JJ/MM/AA".
    Pierre

  3. #3
    Expert éminent sénior Avatar de Artemus24
    Homme Profil pro
    Agent secret au service du président Ulysses S. Grant !
    Inscrit en
    Février 2011
    Messages
    6 380
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Agent secret au service du président Ulysses S. Grant !
    Secteur : Finance

    Informations forums :
    Inscription : Février 2011
    Messages : 6 380
    Points : 19 062
    Points
    19 062
    Par défaut
    Salut sheepo.

    Il n'y aucune obligation d'utiliser le type DATE en MySql pour stocker vos dates en provenance du fichier Excel.
    Si ces dates sont justes informationnelles et que vous ne devez pas faire de calculs dessus, alors vous pouvez les stocker sous forme d'une chaîne de caractères.

    Donc suivez le conseil de pier.antoine. Insérez vos dates directement dans votre table MySql.

    Voici un exemple en php pour transformer votre date dans le bon format :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    <?php
    	$source = '31-12-1960';
    	$date = new DateTime($source);
    	echo $date->format('Y-m-d');
    ?>
    @+
    Si vous êtes de mon aide, vous pouvez cliquer sur .
    Mon site : http://www.jcz.fr

  4. #4
    Modérateur

    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 799
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 799
    Points : 34 031
    Points
    34 031
    Billets dans le blog
    14
    Par défaut
    Il n'y aucune obligation d'utiliser le type DATE en MySql pour stocker vos dates en provenance du fichier Excel.
    Si ces dates sont justes informationnelles et que vous ne devez pas faire de calculs dessus, alors vous pouvez les stocker sous forme d'une chaîne de caractères.
    Jusqu'au jour où on veut faire des statistiques sur les dates et c'est la merde !

    Bravo de donner un mauvais conseil à un étudiant !
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole. Autoentrepreneur.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
    À la maison comme au bureau, j'utilise la suite Linux Mageïa !

  5. #5
    Expert éminent sénior Avatar de Artemus24
    Homme Profil pro
    Agent secret au service du président Ulysses S. Grant !
    Inscrit en
    Février 2011
    Messages
    6 380
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Agent secret au service du président Ulysses S. Grant !
    Secteur : Finance

    Informations forums :
    Inscription : Février 2011
    Messages : 6 380
    Points : 19 062
    Points
    19 062
    Par défaut
    Salut Cinephil.

    Est-ce que tu as lu la problématique de sheepo ? Je suppose que non !
    Il a des dates qui sont inférieures à 1970 ? Comment veux-tu les stocker dans le type date, si celui-ci n'accepte pas une date plus petite que 1970 ?

    Et voici ce que je dis :

    Citation Envoyé par Artemus24
    Si ces dates sont justes informationnelles et que vous ne devez pas faire de calculs dessus, alors vous pouvez les stocker sous forme d'une chaîne de caractères.
    Maintenant si tu as la solutions, nous t'écoutons.

    @+
    Si vous êtes de mon aide, vous pouvez cliquer sur .
    Mon site : http://www.jcz.fr

  6. #6
    Expert confirmé
    Profil pro
    Inscrit en
    Août 2008
    Messages
    2 947
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 2 947
    Points : 5 846
    Points
    5 846
    Par défaut
    Le problème n'est pas qu'on ne peut pas stocker une date inférieur à 1970 dans un type date, le problème est de travailler avec une date sur 2 chiffres seulement:

    La solution est de récupérer correctement la date dans la partie java.

  7. #7
    Membre émérite
    Homme Profil pro
    tripatouilleur de code pour améliorer mon quotidien boulistique
    Inscrit en
    Février 2008
    Messages
    939
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : tripatouilleur de code pour améliorer mon quotidien boulistique
    Secteur : Enseignement

    Informations forums :
    Inscription : Février 2008
    Messages : 939
    Points : 2 287
    Points
    2 287
    Par défaut
    Bonjour

    Est-on sûr de ne jamais avoir à faire de calculs sur les dates ?

    Pour ma part, les mettre sous forme de chaîne me parait ennuyeux, car c'est prendre des mauvaises habitudes.

    Je pense qu'il vaut mieux prendre le temps de régler un problème maintenant, plutôt que tout soit bloqué plus tard. Je souhaite bon courage à celui qui devrait changer le format de cette colonne.

    Quant au souci des dates inférieures à 1970, il faut bien évidemment trouver un moyen de le contourner, car on peut facilement trouver des bases de données avec de telles dates et des calculs à faire dessus (ne serait-ce que la gestion du personnel, avec calculs de prime d'ancienneté, ou de droit à la retraite...)

    Ce que je comprends dans le propos de Cinéphil, c'est que c'est dangereux de donner comme piste de contourner le problème par une bidouille, surtout à un étudiant qui doit non seulement apprendre les bonnes habitudes mais doit aussi rendre des "devoirs" corrects. La bidouille ne sera peut-être pas toujours acceptée par les profs.

    Pierre

  8. #8
    Modérateur

    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 799
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 799
    Points : 34 031
    Points
    34 031
    Billets dans le blog
    14
    Par défaut
    Citation Envoyé par Artemus24
    Salut Cinephil.

    Est-ce que tu as lu la problématique de sheepo ? Je suppose que non !
    Ben si, justement ! Et toi ?

    Citation Envoyé par Artemus24
    Il a des dates qui sont inférieures à 1970 ? Comment veux-tu les stocker dans le type date, si celui-ci n'accepte pas une date plus petite que 1970 ?
    Citation Envoyé par sheepo
    Seulement voilà, dans les fichiers Excel, il y a des dates sous la forme "JJ/MM/AAAA"
    Citation Envoyé par MySQL
    The DATE type is used for values with a date part but no time part. MySQL retrieves and displays DATE values in 'YYYY-MM-DD' format. The supported range is '1000-01-01' to '9999-12-31'.
    Ceci étant clairement posé, il n'y a aucun souci à enregistrer les dates issues du fichier Excel dans une colonne de type DATE dans MySQL.

    La bonne piste a été donnée par skuatamad :
    Citation Envoyé par skuatamad
    La solution est de récupérer correctement la date dans la partie java.
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole. Autoentrepreneur.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
    À la maison comme au bureau, j'utilise la suite Linux Mageïa !

  9. #9
    Expert éminent sénior Avatar de Artemus24
    Homme Profil pro
    Agent secret au service du président Ulysses S. Grant !
    Inscrit en
    Février 2011
    Messages
    6 380
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Agent secret au service du président Ulysses S. Grant !
    Secteur : Finance

    Informations forums :
    Inscription : Février 2011
    Messages : 6 380
    Points : 19 062
    Points
    19 062
    Par défaut
    Salut à tous.

    Désolé CinePhil, j'ai confondu le type date avec le type timestamp.

    Citation Envoyé par MySql
    The TIMESTAMP data type is used for values that contain both date and time parts. TIMESTAMP has a range of '1970-01-01 00:00:01' UTC to '2038-01-19 03:14:07' UTC.
    Ce qui m'a induit en erreur, c'est l'exemple donné par sheepo, qui quand il donne une date sous la forme "67-02-12", MySql la convertie en "2067-02-12". Inversement, la date "77-02-12" sera convertie en "1977-02-12".
    Pourquoi ? Car MySql utilise la date pivot '1970-01-01' pour faite ses conversions.

    Voici ce que dit MySql, pour les conversions :

    Citation Envoyé par MySql
    You can specify input YEAR values in a variety of formats:
    As a 4-digit number in the range 1901 to 2155.
    As a 4-digit string in the range '1901' to '2155'.
    As a 1- or 2-digit number in the range 1 to 99. MySQL converts values in the ranges 1 to 69 and 70 to 99 to YEAR values in the ranges 2001 to 2069 and 1970 to 1999.
    As a 1- or 2-digit string in the range '0' to '99'. MySQL converts values in the ranges '0' to '69' and '70' to '99' to YEAR values in the ranges 2000 to 2069 and 1970 to 1999.
    Pour faire une conversion en MySql, il existe des fonctions comme 'date_format' ou encore 'cast', mais elles s'utilisent dans un select.

    Il n'existe pas de solutions de conversions avec MySql, lors d'un insert. La solution la plus simple est de mettre la date sous le bon format en java.

    Citation Envoyé par Sheepo
    Seulement voilà, dans les fichiers Excel, il y a des dates sous la forme "JJ/MM/AAAA", et quand je les récupère en Java, il sont de la forme "JJ/MM/AA".
    Toute la question est comment tu converties ta chaine de caractères ?
    Je pense que tu converties ta chaine de caractères au type date de java.
    Je pense que tu dois utiliser la fonction 'substring' pour extraire et réorganiser ta date qui doit rester sous forme d'une chaine de caractères.

    C'est ce que tu vas ensuite donner à MySql pour qu'il vienne l'insérer dans la colonne de type date.

    @+
    Si vous êtes de mon aide, vous pouvez cliquer sur .
    Mon site : http://www.jcz.fr

Discussions similaires

  1. ittération sur les tables d'une base de donnée
    Par romyos dans le forum Développement de jobs
    Réponses: 1
    Dernier message: 22/02/2009, 22h50
  2. Test unitaire sur les vue d'une base de données
    Par bragon dans le forum Tests et Performance
    Réponses: 4
    Dernier message: 04/02/2009, 12h29
  3. Réponses: 2
    Dernier message: 26/12/2008, 14h54
  4. Réponses: 1
    Dernier message: 22/04/2008, 21h25
  5. Lister les tables d'une base de données MySQL
    Par Legenyes dans le forum SQL Procédural
    Réponses: 3
    Dernier message: 05/07/2006, 18h43

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