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 :

Requete concernant des dates un peu complexe (pour moi)


Sujet :

Requêtes MySQL

  1. #1
    Membre actif
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    291
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Avril 2007
    Messages : 291
    Points : 217
    Points
    217
    Par défaut Requete concernant des dates un peu complexe (pour moi)
    Bonjour,

    Je suis un peu bloquée sur une requete : j'ai trois tables :
    horaire
    salarie
    travailler

    Un salarie travaille avec tel horaire pendant une période allant de date_debut à date_fin

    Je voudrais recuperer la somme des durées de toutes les périodes pour l'année en cours. Jusque là ça va. Le souci :
    Si une période commence le 27/12/07 et finit le 05/01/08, je ne veux récupérer que du 01/01/08 au 05/01/08.
    Sinon ça provoque des chiffres erronées. Imaginez : Mme Machin a fait 800 jours d'horaires Z dans l'année 2008 => C'est louche...

    Voila où j'en suis :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    select SUM(DATEDIFF(date_fin, date_debut)) from travailler
    where (date between '2008-01-01' and '2008-12-31)
    and id_salarie= 10 and id_horaire =5;
    Merci pour votre aide, en espérant m'être bien expliquée

  2. #2
    Membre confirmé
    Profil pro
    Inscrit en
    Août 2005
    Messages
    514
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2005
    Messages : 514
    Points : 631
    Points
    631
    Par défaut
    Bonjour,
    et pourquoi ne pas utiliser YEAR() plutôt que BETWEEN?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    WHERE `id_salarie` = 10 AND `id_horaire` = 5 AND YEAR(`date`) = 2008
    Du reste, pour vous aider plus avant, j'aurais besoin de la structure de la table travailler.

    Cordialement,
    DaRiaN.

  3. #3
    Membre actif
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    291
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Avril 2007
    Messages : 291
    Points : 217
    Points
    217
    Par défaut
    Merci de votre aide.

    Je ne connaissais pas la fonction YEAR(), effectivement, c'est beaucoup mieux!

    La table travailler :

    id_horaire (cle etrangere)
    id_salarie (cle etrangere)
    date_debut
    date_fin

    La table travailler associe salarie et horaire (relation n-n).

    Merci

  4. #4
    Membre confirmé
    Profil pro
    Inscrit en
    Août 2005
    Messages
    514
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2005
    Messages : 514
    Points : 631
    Points
    631
    Par défaut
    Vous n'avez pas de colonne nommée `date` donc votre requête ne peut pas fonctionner. Est ce que ceci satisferait vos exigences :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SELECT SUM(DATEDIFF(date_fin, date_debut)) 
    FROM travailler 
    WHERE `id_salarie` = 10 
     AND `id_horaire` = 5 
     AND YEAR(`date_debut`) = 2008;
    Ou faut-il travailler aussi avec la colonne `date_fin`? En association strict avec `date_debut`? Imaginons une valeur de `date_debut` commençant en 2007, mais ayant pour `date_fin` une valeur contenant 2008, que ferez-vous?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SELECT SUM(DATEDIFF(date_fin, '2008-01-01')) 
    FROM travailler 
    WHERE `id_salarie` = 10 
     AND `id_horaire` = 5 
     AND (YEAR(`date_debut`) = 2007 AND YEAR(`date_fin`) = 2008);
    Puis additionner les deux résultats? De plus, considérez-vous que l'employé à travailler une ou deux journées quand date_debut = 2008-01-01 et que date_fin = 2008-01-02?

  5. #5
    Membre actif
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    291
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Avril 2007
    Messages : 291
    Points : 217
    Points
    217
    Par défaut
    Effectivement, si une période commence le 27/12/07 et finit le 10/janvier 2008 je ne veux récupérer que du 01/01/08 au 10/01/08.
    Lorsque date_debut=01/01 et date_fin=02/01 ça compte pour deux jours.

    Donc oui il me faudrait recuperer toutes les périodes de 2008 et pour chaque période vérifier s'il y a une partie de la période en dehors de l'année (ça marche aussi dans le sens date_debut en 2008 et date_fin en 2009). Si oui alors soustraire la partie qui est en dehors.

    Mais je commence à douter que ce soit possible...

    Sinon je peux le traiter coté code, mais c'est assez lourd...

    En tout cas, merci de vous pencher sur mon problème!

  6. #6
    Membre confirmé
    Profil pro
    Inscrit en
    Août 2005
    Messages
    514
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2005
    Messages : 514
    Points : 631
    Points
    631
    Par défaut
    Moi, en PHP avec une seule requête MySQL :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    <?php
     
      function GetDays($dDate, $fDate, $aPeriode)
      {  
        list($aaaa, $mm, $jj) = explode('-', $dDate);
     
        if ($aaaa == $aPeriode) $dUnix = mktime(0, 0, 0, $mm, $jj, $aaaa);
        else $dUnix = mktime(0, 0, 0, 1, 1, $aPeriode);
     
        list($aaaa, $mm, $jj) = explode('-', $fDate);
     
        if ($aaaa == $aPeriode) $fUnix = mktime(23, 59, 59, $mm, $jj, $aaaa);
        else $fUnix = mktime(23, 59, 59, 12, 31, $aPeriode);
     
        return ceil(($fUnix-$dUnix)/86400);        
      }
     
      $id_horaire = 5;
      $id_salaire = 10;  
      $annee = 2008;
     
      $req = 'SELECT `date_debut`, `date_fin` '
      .'FROM `travailler` '
      .'WHERE `id_horaire` = '.$id_horaire.' '
      .' AND `id_salarie` = '.$id_salaire.' '
      .' AND (YEAR(`date_debut`) = '.$annee.' OR YEAR(`date_fin`) = '.$annee.')';
     
      if (!mysql_connect('localhost', 'root', 'xxf8zmi8') 
       || !mysql_select_db('test')
       || !$res = mysql_query($req))
        die(mysql_error());
     
      mysql_close();
     
      $jours = 0;
     
      while (list($debut, $fin) = mysql_fetch_row($res))
       $jours += GetDays($debut, $fin, $annee);
     
      echo $jours;   
     
    ?>
    Et c'est réglé... je me casse jamais trop la tête avec des requêtes MySQL, le serveur a déjà suffisamment à faire avec mes millions de lignes. Par contre, c'est vrai que ça peut faire un très gros résultat, mais dans le cas contraire, c'est parfait!

    Pour le reste, une requête avec d'abord debut = 2008 ET fin = 2008 PLUS datediff avec debut et fin comme valeur, ensuite debut = 2007 ET fin = 2008 PLUS datediff avec 2008-01-01 et fin comme valeur, ensuite debut = 2008 ET fin = 2009 PLUS datediff avec debut et 2008-12-31 comme valeur. En sachant qu'il faut surement rajouter 1 a tous les résultats de datediff, mais c'est faisable en une seule requête, mais j'ai pas le temps de chercher, pis je suis nul en jointure.

  7. #7
    Membre actif
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    291
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Avril 2007
    Messages : 291
    Points : 217
    Points
    217
    Par défaut
    Ok, c'est donc ce que je vais faire...
    Moi j'aime bien me prendre la tete avec les requetes sql parce que, souvent ça simplifie beaucoup le code php derriere.
    M'enfin, vu que moi non plus, je ne sais pas comment faire mieux, ça ira!

    Merci pour votre aide!

    @+

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

Discussions similaires

  1. requête un peu complexe pour moi
    Par remrem59 dans le forum Requêtes
    Réponses: 5
    Dernier message: 04/07/2011, 17h07
  2. [MCD] Gestion des primes un peu complexe pour moi
    Par wallash dans le forum Schéma
    Réponses: 3
    Dernier message: 17/09/2010, 16h00
  3. Réponses: 5
    Dernier message: 12/12/2009, 14h28
  4. requête un peu complexe pour moi (delete + distinct + max)
    Par mdr_cedrick dans le forum Langage SQL
    Réponses: 3
    Dernier message: 04/08/2008, 12h38
  5. Gérer un Formulaire un peu complexe pour moi
    Par budylove dans le forum Langage
    Réponses: 3
    Dernier message: 17/05/2006, 10h01

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