rouskard
Messages postés26Date d'inscriptionmardi 26 février 2008StatutMembreDernière intervention17 mars 2008
-
3 mars 2008 à 16:44
rouskard
Messages postés26Date d'inscriptionmardi 26 février 2008StatutMembreDernière intervention17 mars 2008
-
5 mars 2008 à 11:08
Bonjour,
Et voilà encore une nouvelle colle (enfin la ma tête me crit "arrête de me faire soufrir" )
Voilà le problème, j'ai ma table arret qui se présente sous cette forme :
arret
-----------
numero_arret
numero_personne
date_arret ---->date sous forme aaaa-mm-jj
Je souhaite pouvoir afficher les arrêts (jusque là je n'ai pas de problème ouf!! c'est après que ça se complique),
j'aimerai pouvoir afficher des périodes (des dates qui se suivent dans mon champ "date_arret") sous la forme "du....au...." , sans écrire les dates intermédiaires.
J'ai un début de code mais je ne sais pas si c'est ce qu'il faut :
//je sélectionne les arrets d'une personne sélectionné précédemment
$select_date_arret="SELECT date_arret FROM arret WHERE numero_personne="".$_POST['nom']."" ORDER BY date_arret";
//je fait ma requète SQL (tant qu'il y a des arrets correspondant à la personne sélectionnée)
$resultatArret2 = mysql_query($select_date_arret);
while ($donneeSuite = mysql_fetch_object($resultatArret2))
{
list($annee, $mois, $jour ) = explode('-', $select_date_arret);
$timestamp1 = mktime(0,0,0,$mois,$jour,$annee);
if (strtotime("+1 day",""$annee""-""$mois""-""$jour"")== $donneeSuite->date_arret)
//ça c'est complètement faux (je pense ) mais ca donne un apercu
{
.....
}
}
MasterCent
Messages postés83Date d'inscriptionjeudi 22 septembre 2005StatutMembreDernière intervention14 décembre 20111 4 mars 2008 à 13:37
Je ne peux malheureusement pas continuer à t'aider, ( j'ai une big réunion qui m'attend).
mais : ( conseils )
1) Ecrit une fonction du style diffDate( $strDate1 , $strDate2) qui retournerai le nombre de jour entre deux dates sous format 2008-01-01. (ca doit exister !) Sinon, fait appel au forum. Teste ta fonction avant de l'utiliser.
2)Reprends ton idée premiere ( avec un while )
$select_date_arret="SELECT date_arret FROM arret WHERE numero_personne="".$_POST['nom']."" ORDER BY date_arret";
3) travaille avec deux variables $debut , $fin. qui au départ sont vides
4) et dans ton while, tu auras un test du genre
...
if ( diffDate( $fin , $donneeSuite->date_arret ) > 1 ) {
// $debut et $fin sont exploitables
...
// réaffectation
$debut = $donneeSuite->date_arret ;
$fin = $debut ;
} else {
// poursuite de la recherche de la fin:
$fin = $donneeSuite->date_arret ;
}
5), pense à la sortie (lorsque le while est fini) , sinon tu oublieras la dernière période.
C'est une idée qui'il te faudra retravailler bien sur. ( abuse des echo pour le debug )
//requete sql pour selectionner les arret d'une personne
$select_date_arret="SELECT date_arret FROM arret WHERE numero_personne='19' ORDER BY date_arret";
$resultat_date_arret = mysql_query($select_date_arret);
while ($donnees_arret = mysql_fetch_object($resultat_date_arret))
{
//requete sql pour faire la difference entre 2 jours
MasterCent
Messages postés83Date d'inscriptionjeudi 22 septembre 2005StatutMembreDernière intervention14 décembre 20111 4 mars 2008 à 09:01
Salut,
J'ai pas très bien compris ton problème !
1/ Table ARRET : primary Key est Numero Arret ? , y a t-il une même personne qui s'arrete plusieurs fois ?
2/ est-il possible d'obtenir une requete qui par personne donne la date la plus petite ?
SELECT numero_personne , min ( date_arret ) from ARRET where ... GROUP BY numero_personne
Dans le même ordre d'idée, la fonction max pourrait donner la dernière.
3/ soit une requête UNION (mais j'avoue ne plus me souvenir si elle fonctionne sous MySQL ) , soit deux requetes consecutives et le tour me semble joué ?
A moins que je n'ai pas tout compris à ton problème ?
PS, si tu veux travailler par mois ou par année, il y a moyen de rajouter un champ calculé dans le SQL.
rouskard
Messages postés26Date d'inscriptionmardi 26 février 2008StatutMembreDernière intervention17 mars 2008 4 mars 2008 à 12:07
J'ai fait ca :
SELECT CONCAT( month( date_arret ) , '-', year( date_arret ) ) ASPERIODE, min( date_arret ) , max( date_arret )
FROM `arret`
WHERE numero_personne = '19'
GROUP BY ASPERIODE
le problème c'est que quand un arret va par exemple du 25/05/2007 au 05/06/2007, il m'affiche 2 périodes :
du 25/05/2007 au 31/05/2007
du 01/06/2007 au 05/06/2007
je pense que c'est le ASPERIODE dans le GROUP BY qui ne va pas, j'ai essayé PERIODE mais sql ne l'accepte pas
MasterCent
Messages postés83Date d'inscriptionjeudi 22 septembre 2005StatutMembreDernière intervention14 décembre 20111 4 mars 2008 à 12:21
Pas ASPERIODE , mais bien as PERIODE en deux mots,
group by PERIODE
. Autant pour moi !
Par contre, à la lecture de ta réaction, il semble que ton traitement soit différent que ce que je pensais !
En effet, qu'est ce qu'une période : SQL te donnera un resultat basé sur la date dans le temps.
( une semaine; un mois, une année, un trimestre,... ). Il s'agit d'une compression.
Tu sembles vouloir le début et la fin d'une Période selon le fait que les arrets se suivent de jours en jours, indépendement du mois, de l'année. Nous sommes alors en présence d'un traitement Itératif (c'est à dire dont le résultat dépend de la ligne précédente). Si ton idée est celle-là, alors, il faudra recourir à du code PHP.
Peux tu préciser ce que tu entends par période ?
2008-02-29 : debut
2008-03-01
2008-03-02 : fin, car pas d'arret le lendemain ...
2008-03-05 : debut, car il n'y a pas eu d'arret la veille
etc...
rouskard
Messages postés26Date d'inscriptionmardi 26 février 2008StatutMembreDernière intervention17 mars 2008 4 mars 2008 à 12:32
C'est tout à fait cela mais le problème c'est que l'on peut rajouter une date 1 mois après avoir entré une période, je m'explique dans ma table "arret", on a des dates qui sont enregistrées de la façon suivante :
rouskard
Messages postés26Date d'inscriptionmardi 26 février 2008StatutMembreDernière intervention17 mars 2008 5 mars 2008 à 10:02
Encore une petite dernière question, je ne sais pas comment faire la parit 5) de MasterCent, à savoir écrire du code à la sortie de mon while pour ne pas oublier la dernière valeur.
Quelqu'un pourrait il m'aider?