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

Requêtes MySQL Discussion :

Convertir une date dans une requête


Sujet :

Requêtes MySQL

  1. #1
    Membre actif
    Avatar de Freedolphin
    Homme Profil pro
    Webmaster
    Inscrit en
    Février 2006
    Messages
    291
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Webmaster
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Février 2006
    Messages : 291
    Points : 225
    Points
    225
    Par défaut 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
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 133
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : bourreau
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2010
    Messages : 10 133
    Points : 38 555
    Points
    38 555
    Billets dans le blog
    9
    Par défaut
    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 Avatar de Artemus24
    Homme Profil pro
    Agent secret au service du président Ulysses S. Grant !
    Inscrit en
    Février 2011
    Messages
    6 378
    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 378
    Points : 19 055
    Points
    19 055
    Par défaut
    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
    Avatar de Freedolphin
    Homme Profil pro
    Webmaster
    Inscrit en
    Février 2006
    Messages
    291
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Webmaster
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Février 2006
    Messages : 291
    Points : 225
    Points
    225
    Par défaut
    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 Avatar de Artemus24
    Homme Profil pro
    Agent secret au service du président Ulysses S. Grant !
    Inscrit en
    Février 2011
    Messages
    6 378
    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 378
    Points : 19 055
    Points
    19 055
    Par défaut
    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
    Avatar de Freedolphin
    Homme Profil pro
    Webmaster
    Inscrit en
    Février 2006
    Messages
    291
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Webmaster
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Février 2006
    Messages : 291
    Points : 225
    Points
    225
    Par défaut
    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
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 133
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : bourreau
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2010
    Messages : 10 133
    Points : 38 555
    Points
    38 555
    Billets dans le blog
    9
    Par défaut
    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

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [DeskI V5-V6] Récupérer une plage de date dans plusieurs requêtes
    Par dufrane dans le forum Débuter
    Réponses: 1
    Dernier message: 08/10/2010, 11h17
  2. Convertir une requête XPath avec LINQ to Objects
    Par SaumonAgile dans le forum Linq
    Réponses: 3
    Dernier message: 08/05/2009, 15h54
  3. Convertir une requête Mysql en T-SQL
    Par abdo1966 dans le forum Langage SQL
    Réponses: 0
    Dernier message: 26/11/2008, 14h33
  4. Convertir une requête Acces en MySQL
    Par Creepy78 dans le forum Langage SQL
    Réponses: 10
    Dernier message: 28/02/2006, 16h24
  5. Convertir une requête Access en MySQL
    Par iomega dans le forum Langage SQL
    Réponses: 5
    Dernier message: 06/03/2004, 09h47

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