Aide pour gestion date mysql php

Résolu
Bonjour,
Bonjour,

j'ai probleme et j'espere j'aurais d'aide.

en effet j'ai table ou j'ai 3 champs :

--| ID | debut-date | fin_date
--| 1 | 2008-04-12 | 2008-04-26
--| 2 | 2008-04-12 | 2008-04-14

cette table stocke touts les conges de caqhe agent et bien sur debut gonges (debut-date) et fin conges( fin date)

le probleme que j'ai centaines de ligne dans la table et je dois creer interface qui va calculer nombre de jour de conges total chaque semaine
c'est a dire imaginons semaine x de 12-04-2008 jusqu'au 17-04-2008 (j'ai mis 17 car dimanche on compte pas)

donc si je fais simple calcul je vais trouver 6 jours dans la ligne 1 du table et et 3 jours dans la ligne 2 donc resulat et 9 jour pour cette semaine
ma kestion comment je creer script php ou requete mysql pour afficher nombre total de conges pour chaque semaine (jusqu'au 52 )
j'ai essayer datedif et meme j'ai ajouté table ou j'ai stocké debut et fin de semaine de toute l'année pour ajouter un where dans la requete et aussi between mais ça marche pas
qq peux m'aider stp . ei st vous prposez aussi script php ça sera trop gentil
merçi d'avance
Configuration: Windows XP
Internet Explorer 6.0

22 réponses

  1. je sais pas si j'aurais réponse de ta part croy mais tu conais equivalences fonctions TO_date et WEEK en access
    1. sinon il ya aussi autre probelme
      kan je met Select WEEK(2007-12-31') dans my sql juste pour tester il m'affiche 52

      or les entreprises considere ce jour dans semaine 1 de 2008
      1. croy salut
        en faite je suis entrein e tester sur quelque lignes dans la table. mais j'ai ajouté 2 lignes

        la premiere ligne est : date debut (20 decembre 2007) et date fin (20 janvier 2008)
        la deuxieme ligne est date debut (20 decembre 2008) et date fin (20 janvier 2008)

        et la t'a raison li ya probleme

        1- semaine 1 de 2008 comence en 31 decembre 207 mais ce script bien sur avec variable $ année=2008 comence 1 janvier . donc j'ai un jour ki me manque et bien sur si j'ai beaucoup d'agent qui ont pris congés dans cette période et comme tu sais tres bien c'est periode de vacances alors j'aurais calcul inexate .

        2- semaine 52 se termine en 27 decembre 2008 et apres j'aurais semaine 1 de 209 qui comence 28 decembre
        mais résultat que j'ai eu
        c'est:
        [52] => 6
        [53] => 6
        [54] => 3
        donc il incrimente à l'infini si on peux dire ça
        la galère comme je t'ai montré au début de discussion ou on fait script do while ou while se termine a 31 decembre 2008 et la on remet tous les variables à 0 . mais j'a tjours eu de prob pour do while ce qu'il boucle a l'infini et j'aurais jamais des résultat ( error: temps d'execution a dépasser 30 secondes)

        pour jours fériées je voix pas comment tu met array donc boucle for :

        sinon t'a raison pour tes remarques . c'est très important dans cette problématique
        1. Pour le pb des débuts/fins d'année, tu as le temps mais, une recommandation, ne fait pas cela à la main ce qui te posera bien plus de pb de maintenance que de traiter le pb par un algorithme un peu difficile à trouver.

          Pour les jours fériés, attention aussi à la maintenance de la solution adoptée. La solution que j'explorerais serait de créer une table des jours fériés, de la lire et mettre dans un tableau au début du script puis de tester dans la boucle for( $jour = $jourDebut; $jour <= $jourFin; $jour++ ) si $jour se trouve dans ce tableau.

          En programmation il y a en particulier deux erreurs à ne pas commettre :
          - ne pas traiter les erreurs
          - négliger la maintenance
          En commetant ces erreurs, on va un peu plus vite pour développer mais on le regrette toujours amèrement par la suite.
          1. non pas encore
            je teste sur semaines d'avril et je croix ça sera la galere pour derniere semaine de decembre apres que j'ai ajouté +1 a WEEK(semaine) car je croix pour lui la première semaine de l'année c'est 0 et il va se bloquer fin de l'année
            mais bien sur j'aurais temps jusqu'au ce temps . peux etre je vais modifier ça a la main
            sinon j'ai testé sur avril même a la main pour comparer résultat et c'est bon . les résultat sont nikel
            j'eesay de faire truc des jours feriées pour qu'il prenne pas en compte comme 1 mai et 14 juillet
            j'essai de faire ça en requete comme NOT IN ou NOT exists
            sinon dois je etre memebre pour cliquer sur lien problème résolu ? je voix null part bouton?
            1. Tes modifications sont judicieuses.

              As-tu bien vérifié ce qui se passe pour les semaines de début et fin d'année ?
              1. sinon croy j'ai changé 2 choses . je sais pas si t'a remarqué mais si tu donne simple requete dans my sql : Select WEEk('2008-04-01') ,il va afficher 13, et dans calendrier de 2008 cette semaine est 14 . donc je sais pas mysql il prend quel calendrier donc il faut ajouter 1 a cette requete ....
                bref j'ai changé donc $nbrJours[ $semaine+1 ]++; au lieu de $nbrJours[ $semaine-1 ]++;

                et
                if( $jourSemaine > 1 AND $jourSemaine <= 7 )

                au lieu de
                if( $jourSemaine > 1 AND $jourSemaine < 7 ) pour qu'il prenne en compte samedi (en samedi on travaille aussi et oui!!!)
                j'ai testé ça marche nikel maintenant
                grand merçi pour toi croy

                voila script pour ceux qui ont meme probleme :
                <?php
                $host = 'localhost';
                $user = 'root';
                $bdd = 'cm';

                mysql_connect($host, $user,'') or die("erreur de connexion au serveur");

                mysql_select_db($bdd) or die("erreur de connexion a la base de donnees");
                $annee = 2008;
                // date (mysql type DATE) lundi de cette semaine --> $dateLundi

                // date (mysql type DATE) vendredi de cette semaine --> $dateVendredi

                // recherche en base des congés chevauchant cette semain
                $query = "SELECT "
                . "WEEK( Date_debut ) AS wDebut,DAYOFWEEK( Date_debut ) AS wsDebut,"
                . "TO_DAYS( Date_debut) AS dDebut,TO_DAYS( Date_fin ) AS dFin"
                . " FROM com"
                . " WHERE YEAR(Date_debut) =" . $annee
                . " OR YEAR(Date_fin) =" . $annee ;
                //echo '<br>...' . $query;

                $result = mysql_query( $query ) or die( mysql_error() );

                // réservationtableau pour les nbre de jours par semaine
                for( $i=0; $i<53; $i++ )
                $nbrJours[ ] = 0;
                // boucle sur les enregistrements de la table
                while( $line = mysql_fetch_array( $result ) )
                {
                $semaine = $line['wDebut'];
                $jourSemaine = $line['wsDebut']; // dimanche = 1
                $jourDebut = $line['dDebut'];
                $jourFin = $line['dFin'];
                for( $jour = $jourDebut; $jour <= $jourFin; $jour++ )
                {
                if( $jourSemaine > 1 AND $jourSemaine <= 7 )
                $nbrJours[ $semaine+1 ]++;
                $jourSemaine++;
                if( $jourSemaine > 7 ) {$semaine++; $jourSemaine = 1;}
                }
                }
                // affichage résultat
                echo '<pre>'; print_r( $nbrJours ); echo '</pre>';
                ?>
                1. j'arrive pas a cliquer sur lien probleme résolu . il parait pas mais je vais essayer ça le soir chez moi .
                  sinon c'est résolu
                  merçi croy
                  1. merçi croy pour ton aide
                    ton script marche tres bien . bien sur je dois ajouter quelques trucs et surtout pour les jours feriés.....
                    grand merçi pour ton aide tu m'a sauvé la vie!!!
                    1. Ca aurait été mieux de le dire au départ car ceci change tout : pour éviter de faire une requête pour chaque semaine, on arrive au code suivant :
                      <?php
                      $annee = 2008;
                      //	date (mysql type DATE) lundi de cette semaine --> $dateLundi
                      $dateLundi = "2008-04-14";
                      //	date (mysql type DATE) vendredi de cette semaine --> $dateVendredi
                      $dateVendredi = "2008-04-18";
                      //	recherche en base des congés chevauchant cette semain
                      $query = "SELECT "
                      		. "WEEK( debut_date ) AS wDebut,DAYOFWEEK( debut_date ) AS wsDebut,"
                      		. "TO_DAYS( debut_date ) AS dDebut,TO_DAYS( fin_date ) AS dFin"
                      	. " FROM tblConges"
                      	. " WHERE YEAR(debut_date) =" . $annee
                      		. " OR YEAR(fin_date) =" . $annee;
                      echo '<br>...' . $query;
                      require( 'includes/mySql.php' );
                      $result = mysql_query( $query ) or die( mysql_error() );
                      
                      //	réservationtableau pour les nbre de jours par semaine
                      for( $i=0; $i<53; $i++ )
                      	$nbrJours[ ] = 0;
                      //	boucle sur les enregistrements de la table
                      while( $line = mysql_fetch_array( $result ) )
                      	{
                      	$semaine = $line['wDebut'];
                      	$jourSemaine = $line['wsDebut'];	// dimanche = 1
                      	$jourDebut = $line['dDebut'];
                      	$jourFin = $line['dFin'];
                      	for( $jour = $jourDebut; $jour <= $jourFin; $jour++ )
                      		{
                      		if( $jourSemaine > 1 AND $jourSemaine < 7 )
                      			$nbrJours[ $semaine-1 ]++;
                      		$jourSemaine++;
                      		if( $jourSemaine > 7 ) {$semaine++; $jourSemaine = 1;}
                      		}
                      	}
                      //	affichage résultat
                      echo '<pre>'; print_r( $nbrJours ); echo '</pre>';
                      ?>
                      


                      Il faut que tu traite des cas que je n'ai pas traité comme par exmple le cas de la première semaine de l'année qui est à cheval sur deux années.

                      Bon courage.
                      1. croy bonsoir
                        je sais que je demande beaucoup mais juste tout petite aide.
                        c'est que comment je peux ajouter boucle qui commence du semaine 01-01-2008 jusqu'au derniere semaine de l'année sans qu'il se bloque a fin d'afficher 52 lignes de resultat (c'est a dire nombre total de conges par semaine)
                        sinon ton script est trop fort je te remercie encore une fois
                        1. croy salut
                          vraiment tu mérite un cadeau
                          t'es fort en php et aussi t'es un bon ami
                          tu m'a aidé trop je te remercie.
                          me reste maintenant que je trouve bonne boucle pour afficher tous les semaines de l'année et surtout cette boucle ne reste pas a l'infini sans résultat
                          des que je résoudre je vais mettre solution résolu
                          merçi encore une fois
                          1. Essaye ce code
                            <?php
                            $numeroSemaine = 15;
                            $anneeSemaine = 2008;
                            //	date (mysql type DATE) lundi de cette semaine --> $dateLundi
                            $dateLundi = "2008-04-14";
                            //	date (mysql type DATE) vendredi de cette semaine --> $dateVendredi
                            $dateVendredi = "2008-04-18";
                            //	recherche en base des congés chevauchant cette semain
                            $query = "SELECT id, TO_DAYS( debut_date ) AS debut, TO_DAYS( fin_date ) AS fin, TO_DAYS('" . $dateLundi . "') AS lundi"
                            	. " FROM tblConges"
                            	. " WHERE"
                            		. " ( WEEK( debut_date ) <= " . $numeroSemaine . " AND YEAR( debut_date ) <= " . $anneeSemaine . ")"
                            		. " AND ( WEEK( fin_date ) >= " . $numeroSemaine . " AND YEAR( fin_date ) >= " . $anneeSemaine . ")";
                            //echo '<br>...' . $query;
                            require( 'includes/mySql.php' );
                            $result = mysql_query( $query ) or die( mysql_error() );
                            
                            //	calcul du nbre de jours de congés dans la semaine
                            $nbrJours = 0;
                            while( $line = mysql_fetch_array( $result ) )
                            	{
                            	$dateDebut = $line['debut'];
                            	$dateFin = $line['fin'];
                            	$dateLundi = $line['lundi'];
                            	$dateVendredi = $dateLundi+4;
                            	$nbr = 0;
                            	for( $jour = $dateDebut; $jour <= $dateFin; $jour++ )
                            		{
                            		if( $jour >= $dateLundi AND $jour <= $dateVendredi )
                            			$nbr++;
                            		}
                            echo '<br>' . $line['id'] . '...' . $nbr . ' jours     ' . $dateDebut . '...' . $dateFin . '...' . $line['lundi'];
                            	$nbrJours += $nbr;
                            	}
                            //	affichage résultat
                            echo '<br>Nbre jours : ' . $nbrJours;
                            ?>
                            
                            1. salut croy
                              grand merçi pour toi a l'interet que tu porte a mon probleme
                              pour ton code il marche
                              il m'affiche les lignes selon clause where de date debut et fin dans la semaine 15
                              mais d'abors est ce que t'a compris problematique ?
                              a fin t'expliquer les points pas claire dans la problématique
                              1. salut croy
                                merçi pour aide
                                je t'explique probleme peux etre tu va m'aider a résoudre. imagine t'a 100 agents qui prennent des conges de maladie toute l'année. bien sur tu va stocker ces conges dans une table d'ou tu va saisi bien sur aprat nom prénom id ... date debut de conges et autre champs fin de conges

                                imaginons que je veux avoir nombre total de jours de conges d'une une semaine quelconque

                                je peux avoir par exemple 50 jour. je t'ecris table encore une fois:

                                | Date_debut | Date_fin |
                                | 2008-04-01 | 2008-04-14 |
                                | 2008-04-02 | 2008-04-05 |
                                | 2008-04-02 | 2008-05-05 |

                                si je fais calcul de nombre de jour de conges dans semaine de 01/04/2008 je vais trouvés 17 sans que je prene en compte dimanche. probleme dans la requete ou je met DATDIFF(date_debut, date_fin) avec where Week(2008-04-01) il va calculé totalité de difference de toute l'année, pas dans une semaine précise .
                                c'est pour cela comme je ecris pour script php ,n a essayé de faire boucle pour parcourir toute l'année calculé chaque semaine sans prendre compte de dimanche.
                                sinon tu peux me donner email pour t'envoyer script et table a fin de mieux comprendre
                                1. merçi croy c'est gentil je vais faire ça ce soir et te contacter apres si je trouve prob
                                  mais sinon j'ai essyé avec aide d'un ami de faire script php mysql mais le probleme il se boucle a l'infinni

                                  $date_actuelle = date("d/m/y");
                                  $jour_array = array();
                                  $semaine_array = array();

                                  $jour = 1; //
                                  $semaine = 1;
                                  $nb_conges = 0;
                                  do
                                  {
                                  $requete = mysql_query("SELECT SUM(*) AS nb FROM conges
                                  WHERE $date_actuelle BETWEEN debut AND fin
                                  ");
                                  $reponse = mysql_fetch_array($requete);
                                  $nb = $reponse['nb'];
                                  $jour_array[$date_actuelle] = $nb;

                                  if($jour == 6)
                                  {
                                  $jour = 1;
                                  $semaine_array[$semaine] = $nb_conges;
                                  $semaine++;
                                  $nb_conges = 0;
                                  }
                                  else
                                  $nb_conges += $nb;
                                  $jour++;
                                  $date_actuelle++;
                                  }
                                  while ($date_actuelle != '01/01/2009')

                                  foreach ($semaine_array As $semaine_array)
                                  echo $semaine_array ;

                                  le but de ce script étais de commencer boucle do while de premier jour de l'année . lorsqu'il atteint 6 (equivalent a samedi )il va calculer somme de nombre de conges dans la semaine , puis remtre les paremùtre a zero et reboucle jusqu'au semaine 52
                                  je sais script a des erreurs c'est t pour ça j'ai demandé d'aide
                                  merçi pour coup de main je vais travailer sur ton script et je tien au courant
                                  1. Première étape : sélectionner les enregistrements qui correspondent à la semaine recherchée.

                                    Travaille à partir du code suivant :
                                    <?php
                                    $numeroSemaine = 15;
                                    $anneeSemaine = 2008;
                                    
                                    $query = "SELECT * FROM tblConges"
                                    	. " WHERE"
                                    		. " ( WEEK( debut_date ) <= " . $numeroSemaine . "' AND YEAR( debut_date ) <= " . $anneeSemaine . "')"
                                    		. " AND ( WEEK( fin ) >= " . $numeroSemaine . "' AND YEAR( fin_date ) >= " . $anneeSemaine . "')"
                                    $result = mysql_query( $query );
                                    // étape 1 : vérification des enregistrements sélectionnés
                                    while( $line = mysql_fetch_array( $result ) )
                                    	{
                                    	echo '<br>...' . $line['id'] .'...' . $line['debut_date'] .'...' . $line['fin_date'];
                                    	}
                                    ?>
                                    


                                    Lorsque les enregistrements sélectionnés seront les bons, essaye de les traiter et reviens sur le forum avec les difficultés rencontrées.
                                    • 1
                                    • 2