Partage
  • Partager sur Facebook
  • Partager sur Twitter

Reformatage de date

    7 mars 2019 à 11:48:48

    Bonjour,

    J'ai besoin de votre aide pour reformater des date en SQL, actuellement je les ai comme cela :

    Et je les aimerais sous le format : JJ/MM/AAAA HH:MM

    Je ne comprend pas bien le SQL_DATE_FORMAT, je en sais pas si c'est ce qu'il me faut.

    Merci de votre aide,

    Cordialement,

    Louis

    • Partager sur Facebook
    • Partager sur Twitter
      7 mars 2019 à 14:08:15

      Bonjour,

      Quel SGBD utilises-tu ? MySQL ?

      Quel est le type de la colonne en question ? VARCHAR ?

      Si mes deux propositions sont vraies, alors il te faut regarder vers la fonction STR_TO_DATE() de MySQL.

      https://dev.mysql.com/doc/refman/5.5/en/date-and-time-functions.html#function_str-to-date

      Genre :

      SELECT STR_TO_DATE( maColonneEnVarchar, '%W %e %M %Y %T' ) AS maColonneEnDateTime
      FROM maTable

      -
      Edité par Benzouye 7 mars 2019 à 14:08:29

      • Partager sur Facebook
      • Partager sur Twitter
      Seul on va plus vite, ensemble on va plus loin ... A maîtriser : Conception BDD, MySQL, PHP/MySQL
        14 mars 2019 à 10:56:53

        Bonjour,

        Je te remercie, j'utilise bien MySQL et ma colonne est en TEXT.

        J'ai essayé ce que tu m'as dit cependant le problème est que mes dates sont en français, as-tu une solution à cela ?

        Merci,

        Louis

        • Partager sur Facebook
        • Partager sur Twitter
          14 mars 2019 à 11:54:04

          Il faut jouer sur les locales de MySQL : lc_time_names

          https://dev.mysql.com/doc/refman/8.0/en/locale-support.html

          • Partager sur Facebook
          • Partager sur Twitter
          Seul on va plus vite, ensemble on va plus loin ... A maîtriser : Conception BDD, MySQL, PHP/MySQL
            6 mai 2019 à 11:44:29

            Bonjour,

            A priori les locales : lc_times_names n'influe pas sur le STR_TO_DATE :/

            Vaut-il mieux que je fasse un trigger à l'insertion qui converti mes dates en anglais ? 

            Louis,

            • Partager sur Facebook
            • Partager sur Twitter
              6 mai 2019 à 12:10:30

              Louis Garret a écrit:

              lc_times_names n'influe pas sur le STR_TO_DATE

              Je ne savais pas ... et j'en suis surpris ... désolé pour la fausse piste ...

              Sans répondre à ton problème, je dirais que le mieux c'est quand même de stocker des dates dans des champs DATE ou DATETIME plutôt que dans des champs VARCHAR.

              D'où proviennent les données en amont ? Ne peux-tu pas récupérer des dates formatées plutôt que des chaînes de caractères en français ?

              • Partager sur Facebook
              • Partager sur Twitter
              Seul on va plus vite, ensemble on va plus loin ... A maîtriser : Conception BDD, MySQL, PHP/MySQL
                6 mai 2019 à 17:00:53

                Je récupère les données depuis un Email Parser, ce sont des mails de statut de sauvegarde de serveur et le logiciel de backup me retourne des mails ayant des dates dans ce format.

                -
                Edité par Louis Garret 6 mai 2019 à 17:02:50

                • Partager sur Facebook
                • Partager sur Twitter
                  6 mai 2019 à 17:18:28

                  Je ne connais pas de commande SQL qui vont convertir une date littérale écrite en français en une date au format attendu par MySQL ...

                  Si tu as un programme intermédiaire qui gère les import de tes backup dans MySQL (PHP, C#, Java, Python, etc.) tu devrais pouvoir trouver sur le net des petites fonctions qui vont faire cette conversion, notamment avec des expressions régulière et une table de conversion pour les mois ...

                  Dans quel langage codes-tu ?

                  • Partager sur Facebook
                  • Partager sur Twitter
                  Seul on va plus vite, ensemble on va plus loin ... A maîtriser : Conception BDD, MySQL, PHP/MySQL
                    6 mai 2019 à 17:39:49

                    C'est directement l'email parser via une commande SQL qui insère dans la BDD.

                    Après je fais l'affichage par du PHP.

                    Si je fais un trigger en before insert qui fait une commande du type :

                    SET date_sauvegarde = REPLACE(date_sauvegarde, 'lundi', 'Monday') 
                    WHERE date_sauvegarde LIKE '%lundi%';

                    pour chaque jour de la semaine et mois et qu'ensuite je fais mon str to date ? 

                    Je ne sais pas si ça peut fonctionner ou si c'est très propre :/

                    • Partager sur Facebook
                    • Partager sur Twitter
                      6 mai 2019 à 18:31:08

                      Louis Garret a écrit:

                      Si je fais un trigger en before insert qui fait une commande du type :

                      SET date_sauvegarde = REPLACE(date_sauvegarde, 'lundi', 'Monday') 
                      WHERE date_sauvegarde LIKE '%lundi%';

                      C'est en effet un peu bourrin, mais pourquoi pas ? il faut un peu adapter la syntaxe, avec du IF ELSEIF je testerai ceci :

                      DELIMITER &&
                      
                      CREATE TRIGGER conversion_varchar_date
                      BEFORE INSERT ON MaTable
                      FOR EACH ROW
                      BEGIN
                          IF NEW.colonne_varchar LIKE '%lundi%'        THEN SET NEW.colonne_varchar = REPLACE( NEW.colonne_varchar, 'lundi',    'monday' );
                      	ELSEIF NEW.colonne_varchar LIKE '%mardi%'    THEN SET NEW.colonne_varchar = REPLACE( NEW.colonne_varchar, 'mardi',    'tuesday' );
                      	ELSEIF NEW.colonne_varchar LIKE '%mercredi%' THEN SET NEW.colonne_varchar = REPLACE( NEW.colonne_varchar, 'mercredi', 'wednesday' );
                      	ELSEIF NEW.colonne_varchar LIKE '%jeudi%'    THEN SET NEW.colonne_varchar = REPLACE( NEW.colonne_varchar, 'jeudi',    'thursday' );
                      	ELSEIF NEW.colonne_varchar LIKE '%vendredi%' THEN SET NEW.colonne_varchar = REPLACE( NEW.colonne_varchar, 'vendredi', 'friday' );
                      	ELSEIF NEW.colonne_varchar LIKE '%samedi%'   THEN SET NEW.colonne_varchar = REPLACE( NEW.colonne_varchar, 'samedi',   'saturday' );
                      	ELSEIF NEW.colonne_varchar LIKE '%dimanche%' THEN SET NEW.colonne_varchar = REPLACE( NEW.colonne_varchar, 'dimanche', 'sunday' );
                          END IF;
                          
                          IF NEW.colonne_varchar LIKE '%janvier%'        THEN SET NEW.colonne_varchar = REPLACE( NEW.colonne_varchar, 'janvier',    'january' );
                      	ELSEIF NEW.colonne_varchar LIKE '%février%'    THEN SET NEW.colonne_varchar = REPLACE( NEW.colonne_varchar, 'février',    'february' );
                      	ELSEIF NEW.colonne_varchar LIKE '%mars%'       THEN SET NEW.colonne_varchar = REPLACE( NEW.colonne_varchar, 'mars',       'march' );
                      	ELSEIF NEW.colonne_varchar LIKE '%avril%'      THEN SET NEW.colonne_varchar = REPLACE( NEW.colonne_varchar, 'avril',      'april' );
                      	ELSEIF NEW.colonne_varchar LIKE '%mai%'        THEN SET NEW.colonne_varchar = REPLACE( NEW.colonne_varchar, 'mai',        'may' );
                      	ELSEIF NEW.colonne_varchar LIKE '%juin%'       THEN SET NEW.colonne_varchar = REPLACE( NEW.colonne_varchar, 'juin',       'june' );
                      	ELSEIF NEW.colonne_varchar LIKE '%juillet%'    THEN SET NEW.colonne_varchar = REPLACE( NEW.colonne_varchar, 'juillet',    'july' );
                      	ELSEIF NEW.colonne_varchar LIKE '%août%'       THEN SET NEW.colonne_varchar = REPLACE( NEW.colonne_varchar, 'août',       'august' );
                      	ELSEIF NEW.colonne_varchar LIKE '%septembre%'  THEN SET NEW.colonne_varchar = REPLACE( NEW.colonne_varchar, 'septembre',  'september' );
                      	ELSEIF NEW.colonne_varchar LIKE '%octobre%'    THEN SET NEW.colonne_varchar = REPLACE( NEW.colonne_varchar, 'octobre',    'october' );
                      	ELSEIF NEW.colonne_varchar LIKE '%novembre%'   THEN SET NEW.colonne_varchar = REPLACE( NEW.colonne_varchar, 'novembre',   'november' );
                      	ELSEIF NEW.colonne_varchar LIKE '%decembre%'   THEN SET NEW.colonne_varchar = REPLACE( NEW.colonne_varchar, 'décembre',   'december' );
                          END IF;
                          
                          SET NEW.colonne_date = STR_TO_DATE( NEW.colonne_varchar, '%W %e %M %Y %T' );
                      END&&
                      
                      DELIMITER ;

                      Je pars du principe où tu ajoutes une colonne DATETIME dans la table en question, qui sera remplie par le TRIGGER.

                      Après tu peux mettre cela dans une fonction que tu appelles dans ton TRIGGER, ainsi tu pourras la réutiliser si besoin ;)

                      -
                      Edité par Benzouye 6 mai 2019 à 18:31:36

                      • Partager sur Facebook
                      • Partager sur Twitter
                      Seul on va plus vite, ensemble on va plus loin ... A maîtriser : Conception BDD, MySQL, PHP/MySQL
                        7 mai 2019 à 14:15:27

                        Bonjour,

                        Je vais tester ça dans l'après-midi et te tiens au courant :)

                        Merci beaucoup !

                        • Partager sur Facebook
                        • Partager sur Twitter
                          10 mai 2019 à 12:00:52

                          Bonjour,

                          Après avoir essayé au moment de la création du déclancheur j'ai ce message d'erreur

                          ! MySQL a répondu : #1064 - Erreur de syntaxe près de '&&'

                          CREATE TRIGGER conversion_varchar_date

                          BEFORE INSERT ON save

                          FOR EACH ROW

                          ' à la ligne 1

                          • Partager sur Facebook
                          • Partager sur Twitter
                            10 mai 2019 à 12:13:58

                            Avec quel outil travailles-tu ? PHPMyAdmin ? Console MySQL ? autre chose ?

                            Dans PHPMyAdmin, la gestion des délimiteur se fait différemment, il faut le renseigner dans la fenêtre de saisie SQL.

                            • Partager sur Facebook
                            • Partager sur Twitter
                            Seul on va plus vite, ensemble on va plus loin ... A maîtriser : Conception BDD, MySQL, PHP/MySQL
                              10 mai 2019 à 14:06:00

                              Yes ça a fonctionné via la fenêtre de saisie SQL (Je travaille avec PHPMyAdmin)

                              Je vais tester si le trigger fonctionne bien.

                              Merci beaucoup :)

                              • Partager sur Facebook
                              • Partager sur Twitter
                                10 mai 2019 à 14:19:55

                                Louis Garret a écrit:

                                ça a fonctionné via la fenêtre de saisie SQL (Je travaille avec PHPMyAdmin)

                                C'est vrai que c'est un peu sioux :p

                                • Partager sur Facebook
                                • Partager sur Twitter
                                Seul on va plus vite, ensemble on va plus loin ... A maîtriser : Conception BDD, MySQL, PHP/MySQL

                                Reformatage de date

                                × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                                × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                                • Editeur
                                • Markdown