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 :

Requête Sql pour avoir les mois coulant


Sujet :

PHP & Base de données

  1. #1
    Nouveau membre du Club
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Mai 2011
    Messages
    65
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Dom-Tom

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux
    Secteur : Finance

    Informations forums :
    Inscription : Mai 2011
    Messages : 65
    Points : 39
    Points
    39
    Par défaut Requête Sql pour avoir les mois coulant
    Bonjours à tous,

    L'intitulé n'est pas très clair donc je vais tenté de m'expliquer ici.
    Actuellement j'ai une requête SQL qui me retourne des résultats pour un mois et seulement un mois.
    Voici la requête:

    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT COUNT( ID ) AS total_ouvert,
    COUNT( solvedate ) AS total_resolu
    FROM glpi_excel
    WHERE YEAR( date ) =2012 AND MONTH( date ) =6

    J'aimerais si possible quand je choisis le mois que ça me retourne les résultats des 2 derniers moi également.
    Merci d'avance à ce qui pourront m'aider.

    Cordialement,

  2. #2
    Membre éprouvé Avatar de redoran
    Homme Profil pro
    Développeur-Amateur
    Inscrit en
    Juin 2010
    Messages
    1 346
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : Algérie

    Informations professionnelles :
    Activité : Développeur-Amateur
    Secteur : Santé

    Informations forums :
    Inscription : Juin 2010
    Messages : 1 346
    Points : 1 031
    Points
    1 031
    Par défaut
    salut ; pour faire simple tu peut utilisé un between au lieux de faire une requête avec un paramètre calculé , aussi sa donne aussi un interval large d'analyse dans le temps.

  3. #3
    Expert éminent sénior

    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2010
    Messages
    5 389
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Septembre 2010
    Messages : 5 389
    Points : 10 422
    Points
    10 422
    Par défaut
    J'utiliserais DATE_SUB pour trouver la borne inférieure.
    et j'utiliserais plutôt une requête du type
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    WHERE Date_champ >= DATE_SUB($date_post, INTERVAL 2 MONTH) 
    AND Date_champ = $date_post
    avec comme sous-entendu si comme dans ton exemple tu ne fourni que l'année et le mois :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $date_post = $_POST['annee'].'-'.$_POST['mois'].'-01';
    ou sinon pour la petite histoire tu peux créer $date_post plus savamment en faisant
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    $date = date_create($_POST['annee'].'-'.$_POST['mois']);
    $date_post = date_format($date, 'Y-m-d');

  4. #4
    Expert éminent sénior

    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2010
    Messages
    5 389
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Septembre 2010
    Messages : 5 389
    Points : 10 422
    Points
    10 422
    Par défaut
    Citation Envoyé par redoran Voir le message
    salut ; pour faire simple tu peut utilisé un between au lieux de faire une requête avec un paramètre calculé
    ça change rien, faudra bien calculer à un moment ou a un autre le paramètre inférieur de la borne du beetween puisque la seule valeur fournie est la borne supérieure
    Sinon les beetween ça peut être assez ambigu. On sait mieux ou l'on va en utilisant les opérateurs classique '<', '<=', '>', '>='.

  5. #5
    Membre éprouvé Avatar de redoran
    Homme Profil pro
    Développeur-Amateur
    Inscrit en
    Juin 2010
    Messages
    1 346
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : Algérie

    Informations professionnelles :
    Activité : Développeur-Amateur
    Secteur : Santé

    Informations forums :
    Inscription : Juin 2010
    Messages : 1 346
    Points : 1 031
    Points
    1 031
    Par défaut
    Salut ; ABCIWEB merci pour la méthode d'utilisation de DATE_SUB.
    Pourquoi BETWEEN?

    le développeur peut proposé des solutions surtout dans des cas pareilles afin de données plus de flexibilité et sa fait un calcule de moins dans la requête , parce que l'optimiseur du SGBDR enfin de compte va utilisé un between , si je ne me trompe pas.

  6. #6
    Membre expert Avatar de Fench
    Homme Profil pro
    Chercheur en informatique
    Inscrit en
    Mai 2002
    Messages
    2 353
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Groenland

    Informations professionnelles :
    Activité : Chercheur en informatique
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Mai 2002
    Messages : 2 353
    Points : 3 390
    Points
    3 390
    Par défaut
    Bonjour,

    Citation Envoyé par ABCIWEB
    WHERE Date_champ >= DATE_SUB($date_post, INTERVAL 2 MONTH)
    AND Date_champ = $date_post
    Pourquoi le AND ?

  7. #7
    Nouveau membre du Club
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Mai 2011
    Messages
    65
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Dom-Tom

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux
    Secteur : Finance

    Informations forums :
    Inscription : Mai 2011
    Messages : 65
    Points : 39
    Points
    39
    Par défaut
    Merci pour les réponses de tout le monde.

    J'ai essayé la méthode d'ABCIWEB dans ma base sql en utilisant cette formule:

    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT COUNT( ID ) AS total_ouvert, COUNT( solvedate ) AS total_resolu
    FROM glpi_excel
    WHERE date >= DATE_SUB( YEAR( date ) =2012
    AND MONTH( date ) =6, INTERVAL 2 MONTH )

    J'ai comme résultat trouvé 0.
    J'ai essayé de la mettre directement dans ma pa php pour sortir le graphique et le résultat est zéro toujours...
    J'ai essayé de bidouiller et de chercher pour voir ou était mon erreur mais je n'ai rien trouvé.
    Merci à ceux qui pourront m'aider.

    Cordialement,

  8. #8
    Modérateur
    Avatar de sabotage
    Homme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    29 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2005
    Messages : 29 208
    Points : 44 155
    Points
    44 155
    Par défaut
    Moi je ferrais comme ça :

    Premier jour de deux mois en arrière :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $debut  = mktime(0,0,0, $mois - 2, 1, $annee);
    Les enregistrements depuis cette date :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    WHERE Date_champ >= $debut

  9. #9
    Expert éminent sénior

    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2010
    Messages
    5 389
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Septembre 2010
    Messages : 5 389
    Points : 10 422
    Points
    10 422
    Par défaut
    Citation Envoyé par redoran Voir le message
    Salut ; ABCIWEB merci pour la méthode d'utilisation de DATE_SUB.
    Pourquoi BETWEEN?
    Pourquoi le bettween peut être ambigu ? Parce que selon les cas les bornes sont inclues ou ne le sont pas.

  10. #10
    Expert éminent sénior

    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2010
    Messages
    5 389
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Septembre 2010
    Messages : 5 389
    Points : 10 422
    Points
    10 422
    Par défaut
    Citation Envoyé par nitro97130 Voir le message
    Merci pour les réponses de tout le monde.
    J'ai essayé la méthode d'ABCIWEB dans ma base sql en utilisant cette formule...
    Oui il en manquait un peu pour que ça fonctionne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    $post_year='2012';
    $post_month='6';
     
    // intval pour sécuriser les variables
    $date = date_create(intval($post_year).'-'.intval($post_month));
    $date = date_format($date, 'Y-m-d');
     
    $query = "SELECT date FROM glpi_excel 
    WHERE date >= DATE_SUB('$date', INTERVAL 2 MONTH) AND date <= LAST_DAY('$date')";
    Mais tu devrais éviter de nommer tes champs "date" car c'est un mot réservé sql même si je crois me souvenir que mysql le tolère.

  11. #11
    Expert éminent sénior

    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2010
    Messages
    5 389
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Septembre 2010
    Messages : 5 389
    Points : 10 422
    Points
    10 422
    Par défaut
    Citation Envoyé par Fench Voir le message
    Bonjour,
    Pourquoi le AND ?
    pour avoir une borne supérieure.

  12. #12
    Membre expert Avatar de Fench
    Homme Profil pro
    Chercheur en informatique
    Inscrit en
    Mai 2002
    Messages
    2 353
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Groenland

    Informations professionnelles :
    Activité : Chercheur en informatique
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Mai 2002
    Messages : 2 353
    Points : 3 390
    Points
    3 390
    Par défaut
    Citation Envoyé par ABCIWEB Voir le message
    pour avoir une borne supérieure.
    Oui pour la borne supérieure je préfére effectivement ceci
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    WHERE date >= DATE_SUB('$date', INTERVAL 2 MONTH) AND date <= LAST_DAY('$date')";
    Je voyais pas l'intérêt du '=' comme borne

    Bonne journée

  13. #13
    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 : 61
    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 048
    Points
    34 048
    Billets dans le blog
    14
    Par défaut
    En SQL, il est conseillé d'utiliser BETWEEN plutôt que <= et >=.
    Le tout est de se souvenir qu'avec BETWEEN, les bornes sont incluses donc agir sur les dates fournies en conséquence.

    Avec MySQL, si on veut les deux derniers mois jusqu'à aujourd'hui :
    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    BETWEEN DATE_SUB(CURRENT_DATE INTERVAL 2 MONTH) AND CURRENT_DATE

    À noter que la norme SQL n'autorise pas le calcul avec des mois parce que ce n'est pas une quantité fixe (28, 29, 30, 31 jours). MySQL a cependant, à mon avis, une approche assez intelligente du calcul avec des mois.

  14. #14
    Expert éminent sénior

    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2010
    Messages
    5 389
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Septembre 2010
    Messages : 5 389
    Points : 10 422
    Points
    10 422
    Par défaut
    Citation Envoyé par CinePhil Voir le message
    En SQL, il est conseillé d'utiliser BETWEEN plutôt que <= et >=.
    Le tout est de se souvenir qu'avec BETWEEN, les bornes sont incluses donc agir sur les dates fournies en conséquence.
    "Le tout" n'est pas aussi simple que ton message le laisse entendre.

    Si tu conseille BETWEEN, pas mal de débutants vont chercher à l'utiliser absolument dans tous les cas.

    Or à l'usage on a assez vite fait de se heurter à des effets de bords. Par exemple si dans ce lien l'auteur du post avait directement utilisé des opérateurs de comparaison, il aurait vite obtenu le résultat attendu, alors qu'avec BETWEEN il est dans une impasse. Ce n'est pas que BETWEEN ne fonctionne pas correctement mais qu'il est difficile de comprendre ses limites dans certains cas, et donc de savoir quand ne pas l'utiliser. C'est parce que je me suis déjà confronté à des problèmes de ce genre que je disais que BETWEEN peut être ambigu.

    Après tu vas me dire qu'on peut toujours résumer cela en disant "Le tout est de se souvenir qu'avec BETWEEN, les bornes sont incluses". Oui effectivement mais il n'est pas toujours évident d'appréhender les conséquences du "tout", et c'est ce que je voulais dire


    EDIT : ma réserve sur l'utilisation de BETWEEN ne vaut que quand on l'utilise pour des dates...

  15. #15
    Expert éminent sénior

    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2010
    Messages
    5 389
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Septembre 2010
    Messages : 5 389
    Points : 10 422
    Points
    10 422
    Par défaut
    Citation Envoyé par sabotage Voir le message
    Moi je ferrais comme ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $debut  = mktime(0,0,0, $mois - 2, 1, $annee);
    Perso j'évite d'utiliser mktime de nos jours, surtout depuis l'avènement des nouvelles fonctions date de php5.2/php5.3... DateInterval, date_diff

    Surtout qu'avec mktime on est dépendant de la validité du timestamp généré :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    echo date("d-m-Y", mktime(0, 0, 0, 12, 30, 2050));
    //01-01-1970
    echo date_format(date_create('2050-12-30'),"d-m-Y");
    //30-12-2050
    Et puis concernant un topic mysql, il est toujours intéressant (et parfois indispensable) de connaître les fonctions date de mysql. Donc bon...

  16. #16
    Membre expert Avatar de Fench
    Homme Profil pro
    Chercheur en informatique
    Inscrit en
    Mai 2002
    Messages
    2 353
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Groenland

    Informations professionnelles :
    Activité : Chercheur en informatique
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Mai 2002
    Messages : 2 353
    Points : 3 390
    Points
    3 390
    Par défaut
    Remarques moi en 2050, je travaillerais plus en Php

    Edit: Je travaillerais même plus d'ailleurs

  17. #17
    Nouveau membre du Club
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Mai 2011
    Messages
    65
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Dom-Tom

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux
    Secteur : Finance

    Informations forums :
    Inscription : Mai 2011
    Messages : 65
    Points : 39
    Points
    39
    Par défaut
    Merci pour les réponses de tous le monde, j'ai utilisé la solution de ABCIWEB.
    Et ça me donne le résultat que j'ai obtenu est satisfaisant.

    Voici ce que j'ai utilisé en 1er temps:
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    SELECT COUNT(ID) AS total_ouvert,
           COUNT(solvedate) AS total_resolu,
           MONTH(date) AS MOIS,
           YEAR(date) AS ANNEE
    	FROM glpi_excel 
    WHERE date >= DATE_SUB("2012-06-01", INTERVAL 2 MONTH) AND date <= LAST_DAY("2012-06-01")
    GROUP BY MONTH(date)

    Je vais essayer en mettant des variables quand j'aurais le temps mais je pense que ça ne posera pas de problème.
    Merci à tous pour votre aide.

    Cordialement,

  18. #18
    Expert éminent sénior

    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2010
    Messages
    5 389
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Septembre 2010
    Messages : 5 389
    Points : 10 422
    Points
    10 422
    Par défaut
    Citation Envoyé par Fench Voir le message
    Remarques moi en 2050, je travaillerais plus en Php

    Edit: Je travaillerais même plus d'ailleurs
    A la la vitesse à laquelle ils augmentent l'âge de la retraite, c'est pas certain

    Sinon effectivement mon exemple n'est pas très bien choisi car on a rarement l'occasion d'avoir à calculer des dates aussi lointaines et l'emploi de mktime pose plus souvent un problème théorique que pratique.
    Mais comme mktime est aussi limité pour les dates passées, je vais pouvoir me rattraper en disant que j'ai le gros pressentiment d'avoir à faire pour demain un site pour une assoc qui référence des dates historiques

  19. #19
    Nouveau membre du Club
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Mai 2011
    Messages
    65
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Dom-Tom

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux
    Secteur : Finance

    Informations forums :
    Inscription : Mai 2011
    Messages : 65
    Points : 39
    Points
    39
    Par défaut
    Bonjour à tous,

    Je me permet de rouvrir ce topic parce que j'ai remarqué une anomalie.
    En utilisant le code ci-dessous effectivement ça me donne les mois coulant:
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    SELECT COUNT(ID) AS total_ouvert,
           COUNT(solvedate) AS total_resolu,
           MONTH(date) AS MOIS,
           YEAR(date) AS ANNEE
    	FROM glpi_excel 
    WHERE date >= DATE_SUB("2012-06-01", INTERVAL 2 MONTH) AND date <= LAST_DAY("2012-06-01")
    GROUP BY MONTH(date)

    Mais quand je veux afficher le total, il s'affiche mais ce n'est pas le bon.
    Par exemple dans le cas où je dois avec un total de 216 j'ai 192 et je ne sais pas pourquoi...

    Merci à ceux qui pourront m'aider.

    Cordialement,

  20. #20
    Membre expert
    Avatar de ericd69
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2011
    Messages
    1 919
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Avril 2011
    Messages : 1 919
    Points : 3 295
    Points
    3 295
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par ABCIWEB Voir le message
    Pourquoi le bettween peut être ambigu ? Parce que selon les cas les bornes sont inclues ou ne le sont pas.
    salut,

    elles sont toujours inclus et oui between étant un opérateur il utilise donc les éventuels index et quand tu utilises des formules, ça peut éventuellement être plus clair et compact...

    quand tu utilises un nom de colonne qui est un mot clé sql tu dois l'encadrer avec ``

    enfin il faut mettre les colonnes affichées qui ne sont pas dans les fonctions de groupage, l'erreur peut venir de là

    ici faut en effet faire un mixte des 2:
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    WHERE `date` between CURRENT_DATE -INTERVAL 2 MONTH AND CURRENT_DATE
    GROUP BY YEAR(`date`),MONTH(`date`)
    ou encore:
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    where `date`>=concat(year(@d:=current_date - interval 2 month),'-',month(@d),'-01')
    GROUP BY YEAR(`date`),MONTH(`date`)
    ici, il vaudrait donc mieux former la date inférieure en php pour garantir l'utilisation d'un index sur la colonne `date`, ça devrait être plus rapide je pense

Discussions similaires

  1. [MySQL] Imbriquer deux requêtes sql pour avoir un seul résultat
    Par Alexcontact dans le forum PHP & Base de données
    Réponses: 5
    Dernier message: 07/05/2014, 15h56
  2. Réponses: 2
    Dernier message: 16/01/2013, 19h27
  3. requête SQl pour récupérer les noms des tables
    Par taher84 dans le forum Requêtes et SQL.
    Réponses: 2
    Dernier message: 16/07/2010, 22h07
  4. requête sql pour recherche par mois
    Par mahboubi dans le forum Bases de données
    Réponses: 9
    Dernier message: 11/01/2009, 09h05
  5. Requête SQL pour obtenir les intitulés des champs d'une table
    Par Zakapatul dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 01/12/2008, 09h51

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