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

Requêtes MySQL Discussion :

Convertir une date dans une requête


Sujet :

Requêtes MySQL

  1. #1
    Membre actif
    Convertir une date dans une requête
    Bonjour à tous,

    Je rencontre des problèmes avec une requête mysql incluant une conversion de date.
    J'ai une colonne nommée "date" (mais dont le format est text) sous la forme D, j M Y H:i:s (ce qui donne, par exemple, "Wed, 12 Feb 2020 10:48:32").
    Pour l'affichage, je passe par une fonction php très simple :
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    date('d/m/Y', strtotime($date))

    afin d'afficher la date sous le format 12/02/2020.

    Je souhaiterais faire apparaître les dernières dates dans ma requête mysql, avec un ORDER BY, mais le format ne le permet pas. Je cherche donc à convertir la donnée dans la requête même, mais entre DATE_FORMAT, STR_TO_DATE et autre FROM_UNIXTIME, je suis perdu. J'ai fais pas mal de tests mais rien ne fonctionne.

    Voici un exemple de mes essais infructueux :
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    SELECT DATE_FORMAT(date, '%Y%m%d') AS `date` FROM table ORDER BY date DESC


    Auriez-vous une piste pour cette conversion ?
    Merci d'avance !
    Le mieux n'est pas forcément l'ennemi du bien.

  2. #2
    Expert éminent sénior
    bonjour

    Il faut d'abord transformer votre colonne en type date (avec des fonctions substr et autres concaténations) avant d'utiliser date_format().

    Et, on ne le répétera jamais assez, choisir un nom réservé comme "date" pour nommer des objets (tables, colonnes ou autre) est pénible à l'usage et ne présente aucun intérêt

  3. #3
    Expert éminent sénior
    Salut à tous.

    Pour le type date, MySql ne sait traiter que Le format suivant "YYYY-MM-DD".
    Si vous avez une chaîne de caractères en entrée, vous devez la convertir afin d'avoir d'une part le bon format et d'autre part de pouvoir faire des calculs sur vos dates.

    Pour convertir un format "DD/MM/YYYY" en "YYYY-MM-DD", vous devez utiliser la fonction "str_to_date()", comme dans l'exemple ci-après :
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    --------------
    select  str_to_date('1/1/2010 00:00:00', '%e/%c/%Y %H:%i:%s')
    --------------
     
    +-------------------------------------------------------+
    | str_to_date('1/1/2010 00:00:00', '%e/%c/%Y %H:%i:%s') |
    +-------------------------------------------------------+
    | 2010-01-01 00:00:00                                   |
    +-------------------------------------------------------+


    Remplacez votre colonne date de type "varchar()" par le type "date".

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

  4. #4
    Membre actif
    Merci pour vos réponses.
    La conversion de la colonne risque de mettre toutes les données à 0, donc je vais m'abstenir.
    Quant au choix de nommer la colonne "date", c'était un exemple pour être explicite, il se trouve que ma colonne porte un autre nom. Cela dit, je ne vois pas le problème de nommer ainsi, ça a le mérite d'être clair pour celui qui manipule la base.
    C'est peut-être un peu plus touchy pour le développeur qui écrit les requêtes sur les fichiers applicatifs, mais on ne peut pas dire que ça n'a aucun intérêt.
    Pour Artemus (Gordon), ce n'est pas vraiment ce que je demandais puisque mes données ont la forme D, j M Y H:i:s.

    Pour revenir au problème de base, j'ai contourné l'obstacle en créant une nouvelle colonne avec une date au format Ymd, ce qui simplifie la requête avec ORDER BY (je n'en avais besoin que pour les derniers enregistrements).
    Le mieux n'est pas forcément l'ennemi du bien.

  5. #5
    Expert éminent sénior
    Citation Envoyé par Freedolphin
    Cela dit, je ne vois pas le problème de nommer ainsi, ça a le mérite d'être clair pour celui qui manipule la base.
    Date est un mot réservé dans MySql.
    A moins de mettre ce nom entre ` (apostrophe inversé), vous risquez d'avoir des erreurs dans l'interprétation de vos requêtes.

    Citation Envoyé par Freedolphin
    Pour Artemus (Gordon), ce n'est pas vraiment ce que je demandais puisque mes données ont la forme D, j M Y H:i:s.
    Est-ce trop compliqué pour vous de lire la documentation MySql et de faire la conversion ?
    --> https://dev.mysql.com/doc/refman/8.0...on_date-format

    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    --------------
    select  str_to_date('Wed, 12 Feb 2020 10:48:32', '%a, %d %b %Y %H:%i:%s') as votre_date
    --------------
     
    +---------------------+
    | votre_date          |
    +---------------------+
    | 2020-02-12 10:48:32 |
    +---------------------+


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

  6. #6
    Membre actif
    Merci Artemus mais oui je reconnais que c'est un peu compliqué, d'où mon message, je me suis perdu en route avec ces fonctions.
    En poursuivant avec tes indications, j'ai obtenu ce que je voulais de cette façon :
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    select DATE_FORMAT(str_to_date(madate, '%a, %d %b %Y'), '%Y%m%d') as ladate

    Je ne sais pas si c'est vraiment propre dans une requête mais ça fonctionne parfaitement, et ça pourra servir à d'autres.
    Le mieux n'est pas forcément l'ennemi du bien.

  7. #7
    Expert éminent sénior
    Citation Envoyé par Freedolphin Voir le message
    Quant au choix de nommer la colonne "date", c'était un exemple pour être explicite, il se trouve que ma colonne porte un autre nom. Cela dit, je ne vois pas le problème de nommer ainsi, ça a le mérite d'être clair pour celui qui manipule la base.
    Non, être clair c'est nommer la colonne date_debut_periode, date_fin_validite, date_souscription par exemple
    Car nommer "date" une colonne de type "date" n'apporte rien et complique inutilement les requêtes
    Rester simple c'est faciliter la maintenance et donc réduire les coûts