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

PHP & Base de données Discussion :

Problème de sélection de date [MySQL]


Sujet :

PHP & Base de données

  1. #1
    Nouveau membre du Club
    Homme Profil pro
    Intégrateur Web
    Inscrit en
    Mai 2018
    Messages
    57
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Intégrateur Web
    Secteur : Services de proximité

    Informations forums :
    Inscription : Mai 2018
    Messages : 57
    Points : 28
    Points
    28
    Par défaut Problème de sélection de date
    Bonjour,

    Je rencontre un problème sur la sélection de date dans ma base de donnée.
    Je souhaite sélectionner, grâce a un champs date, 2 dates pour récupérer les commandes.
    Voici le code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     $date_v = $DB->query('SELECT date_c, SUM(total_ht) AS somme FROM l_commande WHERE date_c BETWEEN STR_TO_DATE("01-05-2021", "%d-%m-%Y") AND STR_TO_DATE("31-05-2021", "%d/%m/%Y") GROUP BY date_c');
       $count_date = count($date_v);
    J'utilise une date au format JJ-MM-YYYY stocké dans un VARCHAR.
    Comment faire pour soit récupérer les commandes de chaque mois ou d'une date défini.

    Merci pour votre aide.

  2. #2
    Expert éminent Avatar de CosmoKnacki
    Homme Profil pro
    Justicier interdimensionnel
    Inscrit en
    Mars 2009
    Messages
    2 861
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Justicier interdimensionnel

    Informations forums :
    Inscription : Mars 2009
    Messages : 2 861
    Points : 6 565
    Points
    6 565
    Par défaut
    J'utilise une date au format JJ-MM-YYYY stocké dans un VARCHAR.
    Comment faire pour soit récupérer les commandes de chaque mois ou d'une date défini.
    La première chose à faire est de ne pas stocker une date dans un VARCHAR mais dans une colonne de type DATE, ça simplifiera les choses. Sinon utiliser BETWEEN...AND... dans la clause WHERE est bien la marche à suivre.
    Brachygobius xanthozonus
    Ctenobrycon Gymnocorymbus

  3. #3
    Expert éminent
    Avatar de Séb.
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    5 108
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 108
    Points : 8 236
    Points
    8 236
    Billets dans le blog
    17
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    STR_TO_DATE("31-05-2021", "%d/%m/%Y")
    Attention ici le masque de STR_TO_DATE() ne correspond à la date (séparateur "/" au lieu de "-")

    Comment faire pour soit récupérer les commandes de chaque mois ou d'une date défini.
    Quand tes champs seront au format DATE, comme te l'a judicieusement conseillé CosmoKnacki, il suffiera de faire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    // Recherche sur une date YYYY-MM-DD
    $sql = <<<SQL
        SELECT ALL *
        FROM commande 
        WHERE date_c = :date
        SQL;
     
    // Recherche sur un mois au format YYYYMM
    $sql = <<<SQL
        SELECT ALL *
        FROM commande 
        WHERE YEARMONTH(date_c) = :yearmonth
        SQL;
    Un problème exposé clairement est déjà à moitié résolu
    Keep It Smart and Simple

  4. #4
    Nouveau membre du Club
    Homme Profil pro
    Intégrateur Web
    Inscrit en
    Mai 2018
    Messages
    57
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Intégrateur Web
    Secteur : Services de proximité

    Informations forums :
    Inscription : Mai 2018
    Messages : 57
    Points : 28
    Points
    28
    Par défaut
    Bonjour,
    Merci de vos réponses.
    J'ai créer un champs date "date_us" pour finir.
    J'ai fait plusieurs requête pour récupérer les mois, jours, années.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
       $date_j = $DB->query('SELECT date_c, date_us, SUM(total_ht) AS somme FROM l_commande WHERE MONTH(date_us)=MONTH(now()) GROUP BY date_us');
       $date_m = $DB->query('SELECT MONTH(date_us) AS mois, SUM(total_ht) AS somme FROM l_commande GROUP BY MONTH(date_us)');
       $date_a = $DB->query('SELECT YEAR(date_us) AS annee, SUM(total_ht) AS somme FROM l_commande GROUP BY YEAR(date_us)');

  5. #5
    Expert éminent
    Avatar de Séb.
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    5 108
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 108
    Points : 8 236
    Points
    8 236
    Billets dans le blog
    17
    Par défaut
    Attention, avec MONTH() seule tu vas cumuler les mois de différentes années.
    Un problème exposé clairement est déjà à moitié résolu
    Keep It Smart and Simple

  6. #6
    Expert éminent Avatar de CosmoKnacki
    Homme Profil pro
    Justicier interdimensionnel
    Inscrit en
    Mars 2009
    Messages
    2 861
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Justicier interdimensionnel

    Informations forums :
    Inscription : Mars 2009
    Messages : 2 861
    Points : 6 565
    Points
    6 565
    Par défaut
    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT date_c, date_us, SUM(total_ht) AS somme FROM l_commande WHERE MONTH(date_us)=MONTH(now()) GROUP BY date_us
    Il y a à dire sur cette requête:
    • Dans une base de données, tu dois éviter autant que faire se peut de dupliquer les données (pour des raisons évidentes de gain de place, mais cela peut aussi être une signe de mauvaise conception), donc de ce point de vue avoir deux colonnes contenant la même information est problématique.
      C'est bien d'avoir créer une colonne de type DATE, par contre l'ancienne n'est alors plus nécessaire, autant renommer la nouvelle avec le nom de l'ancienne. En plus nommer une colonne date_us n'est pas très heureux, cette colonne avec le type approprié contient des dates et à ce niveau on se moque de savoir comment elle le fait ni même à quoi ça ressemble.
      Si pour ton application PHP il est plus pratique d'avoir des dates dans tel ou tel format, tu peux utiliser la classe DateTime, (le constructeur de cette classe peut recevoir directement une date au format YYYY-MM-DD), et avec sa méthode DateTime::format() renvoyer la date dans n'importe quel format. Le principal intérêt d'un objet DateTime comparé à une chaîne est de pouvoir faire des manipulations sur la date en question ou ne serait-ce qu'extraire le jour, le mois ou l'année sans avoir à bricoler avec les chaînes. Sinon tu peux aussi commencer ta requête par SELECT DATE_FORMAT(date_c, "%d-%m-%Y") ... et te contenter de la chaîne obtenue si c'est pour un simple affichage.
    • Juste pour information à propos des requêtes SELECT avec l'utilisation de fonctions d'agrégations comme SUM() avec une clause GROUP BY: écrire quelque chose comme
      Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
      SELECT col1, col2, SUM(col3) FROM matable GROUP BY col2
      peut te valoir un jolie message du genre:
      SELECT list is not in GROUP BY clause and contains nonaggregated column 'mabase.matable.col1' which is not functionally dependent on columns in GROUP BY clause; this is incompatible with sql_mode=only_full_group_by
      Ce qui signifie en d'autres termes qu'une telle requête exige qu'une ligne parmi celles qui ont été groupées (par la col2) doit être choisie "au hasard" pour renseigner col1 (qui ne figure pas dans la clause GROUP BY et qui n'est pas agrégée par une fonction). Ce genre de requête est illégale, néanmoins MySQL propose le mode ONLY_FULL_GROUP_BY qui peut être activé ou désactivé. Lorsqu'il est désactivé MySQL marche alors à la débrouille (ce qui n'est pas très rassurant comme idée) et utilisera la première ligne du groupe qui a été insérée dans la table. Si tu n'as pas eu de message d'erreur c'est donc que tu es dans ce cas. Mais maintenant imagine faire la même requête avec les mêmes données mais insérées dans un ordre différent et bien là patatras: tu obtiendras une valeur de col1 différente! Ce qui s'oppose au sacro-saint principe déterministe: Même requête sur mêmes données = Même résultat.
      C'est pourquoi depuis la version 5.7 de MySQL cette option est désormais activée par défaut et je t'enjoins à l'activer pour éviter ce genre d'écueil (bien que pour date_c et date_us ce ne soit pas problématique vue que ce sont les mêmes, elles sont dépendantes, et de toute manière une des deux n'est pas nécessaire).
    • Évite l'utilisation de fonctions sur une colonne dans la clause WHERE autant que possible, car ça oblige à appliquer cette fonction sur ta colonne pour toutes les lignes de la table. Je parle ici des fonctions MONTH(), YEAR() et YEARMONTH() appliquées à ta colonne de dates. Alors qu'utiliser BETWEEN...AND ou encore des inégalités <,>,<=,>= sans modifier ta colonne est beaucoup plus performant. De plus c'est sargable.


    À ta place je créerais un index sur ta colonne de date, et ma requête pour obtenir les résultats du mois d'avril par exemple ressemblerait plutôt à ça:
    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    SELECT date_c, SUM(total_ht) as somme
    FROM l_commande
    WHERE date_c >= '2021-04-01'
      AND date_c  < '2021-04-01' + INTERVAL 1 MONTH
    GROUP BY date_c
    ORDER BY date_c

    C'est plus long à écrire, mais c'est plus performant.
    Brachygobius xanthozonus
    Ctenobrycon Gymnocorymbus

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

Discussions similaires

  1. Problème de script SQL : left join et sélection MAX(date)
    Par yoann29200 dans le forum Langage SQL
    Réponses: 13
    Dernier message: 21/01/2016, 15h49
  2. Problème de sélection max(date)
    Par battit64 dans le forum SQL
    Réponses: 3
    Dernier message: 09/12/2013, 10h15
  3. Problème de sélection de dates Access SQL
    Par FoxDeltaSierra dans le forum Requêtes et SQL.
    Réponses: 2
    Dernier message: 22/10/2008, 05h23
  4. Problème de sélection en fonction des dates
    Par skare dans le forum Requêtes et SQL.
    Réponses: 5
    Dernier message: 22/06/2007, 06h47
  5. [CR] Problème de sélection sur un champ date
    Par noluc dans le forum SAP Crystal Reports
    Réponses: 2
    Dernier message: 21/11/2003, 16h56

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