Aide pour gestion date mysql php

Résolu/Fermé
tigre198 - 14 avril 2008 à 01:27
 romualb - 7 oct. 2008 à 17:00
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
A voir également:

22 réponses

gryzzly Messages postés 4608 Date d'inscription lundi 7 novembre 2005 Statut Contributeur Dernière intervention 24 octobre 2020 1 329
14 avril 2008 à 01:36
c'est pas la peine de poster toutes les 10 minutes, ca fera pas répondre plus vite. au contraire, ca donne pas envie de répondre !
0
si tu veux ps aider pas la peine aussi de répondre!!!!
j'ai demandé d'aide et j'attend pas des insultes
donc c'es-t un forum pour aider pas pour mettre n'importe koi
0
gryzzly Messages postés 4608 Date d'inscription lundi 7 novembre 2005 Statut Contributeur Dernière intervention 24 octobre 2020 1 329
14 avril 2008 à 12:28
tu vois des insultes toi ?
où ça ?
0
croy Messages postés 453 Date d'inscription samedi 19 janvier 2008 Statut Membre Dernière intervention 23 octobre 2012 114
14 avril 2008 à 08:13
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.
0
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
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
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
0
croy Messages postés 453 Date d'inscription samedi 19 janvier 2008 Statut Membre Dernière intervention 23 octobre 2012 114
14 avril 2008 à 11:40
As-tu essayé le code que je t'ai envoyé ?

QU'est-ce-qui s'affiche ?
0
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
0
croy Messages postés 453 Date d'inscription samedi 19 janvier 2008 Statut Membre Dernière intervention 23 octobre 2012 114
14 avril 2008 à 14:53
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;
?>
0
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
0
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
0
croy Messages postés 453 Date d'inscription samedi 19 janvier 2008 Statut Membre Dernière intervention 23 octobre 2012 114
14 avril 2008 à 21:35
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.
0
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!!!
0
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
0
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>';
?>
0
croy Messages postés 453 Date d'inscription samedi 19 janvier 2008 Statut Membre Dernière intervention 23 octobre 2012 114
15 avril 2008 à 10:22
Tes modifications sont judicieuses.

As-tu bien vérifié ce qui se passe pour les semaines de début et fin d'année ?
0
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?
0
croy Messages postés 453 Date d'inscription samedi 19 janvier 2008 Statut Membre Dernière intervention 23 octobre 2012 114
15 avril 2008 à 12:19
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.
0
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
0
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
0
pour ceux qui ont eu meme probleme que moi
ce sujet et résolu mais j'ai pas trouvé le bouton de résoudre problème

grand merçi pour croy!!!!!!!

sinon pour prendre en compte les jours feriées voiçi un lien:

http://www.asp-php.net/ressources/bouts_de_code.aspx?id=830

bonne chance a tous
0