Récupérer des données sur un mois, array des jours occupés [Résolu]

Messages postés
36
Date d'inscription
mardi 23 novembre 2010
Statut
Membre
Dernière intervention
4 avril 2013
- - Dernière réponse : 555clR
Messages postés
36
Date d'inscription
mardi 23 novembre 2010
Statut
Membre
Dernière intervention
4 avril 2013
- 24 nov. 2011 à 07:28
Bonsoir !

J'ai deux problèmes auxquels je ne trouve pas de solution :
1/ Le premier se trouve dans ma requête...
Je vous dresse le décor:
- Une table d'évènements avec (entre autres): dates de début(type datetime) et durées(type time)
L'idée serait de récupérer tous les évènements d'un mois :
ceux qui commencent et se finissent le mois en question, mais aussi ceux qui ont débuté le mois précédent et ceux qui se terminent le mois suivant.
J'ai fait cette requête mais elle ne fonctionne pas. Il n'y a pas d'erreur signalée mais elle ne me retourne aucun résultat, alors que des enregistrements sont présents dans la base. je pense avoir fait une erreur mais je ne sais pas où...

Voici mon code :
//Dbt du mois le matin à 00h00
$dbt_mois = 'date(\''.mktime(0, 0, 0, $_GET['m'], 1, $_GET['y']).'\')';
//fin du mois le soir à 00h00
$fin_mois = 'date(DATE_ADD(date(DATE_ADD('.$dbt_mois.', INTERVAL 1 MONTH)), INTERVAL 1 DAY))';
//début evt
$dbt_evt = 'date(event_date_debut)';
//Fin evt
$fin_evt = 'DATE_ADD(event_date_debut,INTERVAL event_duree HOUR_SECOND)';
//condition où : fin evt après dbt du mois && début evt avt fin du mois
$where = '('.$fin_evt.' > '.$dbt_mois.') && ('.$dbt_evt.' <= '.$fin_mois.')';
$sql ='SELECT event_id,event_date_debut,event_duree
FROM evenements
WHERE '.$where.'
ORDER BY day(event_date_debut)';
$req = mysql_query($sql) or die('Erreur SQL !
'.$sql.'
'.mysql_error());
while ($event = mysql_fetch_array($req))
{
$jourbusy[] = array(
'event_id' => $event['event_id'],
'event_date_debut' => $event['event_date_debut'],
'event_duree' => $event['event_duree']);
}
mysql_free_result ($req);

2/ Le second interviendra immédiatement ensuite : je ne vois pas comment faire pour ensuite récupérer les jours du mois occupés par un évènement? Comment lister ces jours ? Existe t-il une fonction ?

Merci d'avance, toutes les pistes seront les bienvenues.
Bonne soirée à tous
Afficher la suite 

4 réponses

Meilleure réponse
Messages postés
197
Date d'inscription
mardi 20 janvier 2004
Statut
Membre
Dernière intervention
20 février 2013
1
3
Merci
Bonjour,

d'après la doc de mysql 5, on peut ajouter un time à un timestamp via la commande addtime lien

// on récupére le début et la fin du mois
$sDebutMois = date('Y-m-d H:i:s', mktime(0, 0, 0, $_GET['m'], 1, $_GET['y']));

$sFinMois = date('Y-m-d H:i:s', mktime(0, 0, 0, $_GET['m']+1, 0, $_GET['y']));

$sWhere = "(event_date_debut >= '$sDebutMois' addtime(event_date_debut, event_duree) >= '$sDebutMois') and event_date_debut <= '$sFinMois'";

$sSQL = 'select event_id, event_date_debut, event_duree '
    . 'FROM evenements '
    . 'WHERE ' . $sWhere;



bonne après midi

Dire « Merci » 3

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources 190 internautes nous ont dit merci ce mois-ci

Commenter la réponse de cs_47
Messages postés
197
Date d'inscription
mardi 20 janvier 2004
Statut
Membre
Dernière intervention
20 février 2013
1
3
Merci
erf et pas d'édition du message ...

j'ai oublié un or dans le where

$sWhere = "(event_date_debut >= '$sDebutMois' or addtime(event_date_debut, event_duree) >= '$sDebutMois') and event_date_debut <= '$sFinMois'";

Dire « Merci » 3

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources 190 internautes nous ont dit merci ce mois-ci

Commenter la réponse de cs_47
Messages postés
36
Date d'inscription
mardi 23 novembre 2010
Statut
Membre
Dernière intervention
4 avril 2013
0
Merci
bonsoir et merci de ton aide... c'est en effet plus propre ainsi !!
en fait ça marche également comme je pensais, une erreur dans l'affichage du timestamp de début de mois :

//Dbt du mois le matin à 00h00
$dbt_mois = 'date(\''.$_GET['y'].'-'.$_GET['m'].'-01\')';

...pour la correction quand même, même si ta solution est plus "directe" (et donc plus propre). je valide !

Du coup reste quand même mon 2ème pb, obscur. Comment récupérer le numéro des jours occupés par un évènement (d'autant qu'on sait que certains peuvent se dérouler sur plusieurs jours ? )

Merci de vos contributions, pistes, idées... je ne vois pas bien comment m'y prendre, là...
Commenter la réponse de 555clR
Messages postés
36
Date d'inscription
mardi 23 novembre 2010
Statut
Membre
Dernière intervention
4 avril 2013
0
Merci
J'ajoute juste ("erf, pas d'édition..."):
la fin du mois correspond au dernier jour du mois à 00h00 (donc le matin !).
Donc juste ajouter au message de 47 soit :
$where = "(event_date_debut >= '$sDebutMois' or addtime(event_date_debut, event_duree) >= '$sDebutMois') and event_date_debut <= DATE_ADD('$sFinMois', INTERVAL 1 DAY)";
soit transformer :
$sFinMois = date('Y-m-d H:i:s', mktime(23, 59, 59, $_GET['m']+1, 0, $_GET['y']));
Je trouvais la seconde solution plus claire à relire donc voilà. Les deux se valent je pense... après en termes de performances je ne me prononcerait pas, je n'en sais fichtre rien).

pour ma récupération des jours occupés, j'ai fait un truc franchement tiré par les cheveux... (j'ai du mal à faire simple).

// on récupére le début et la fin du mois
$sDebutMois = date('Y-m-d H:i:s', mktime(0, 0, 0, $_GET['m'], 1, $_GET['y']));
$sFinMois = date('Y-m-d H:i:s', mktime(23, 59, 59, $_GET['m']+1, 0, $_GET['y']));
//addtime ajoute un time à un timestamp
$where = "(event_date_debut >= '$sDebutMois' or addtime(event_date_debut, event_duree) >= '$sDebutMois') and event_date_debut <= '$sFinMois'";

$sql ='SELECT
event_date_debut,
event_duree
FROM
evenements
WHERE
'.$where;
//connexion
bdconnect();
$req = mysql_query($sql) or die('Erreur SQL !
'.$sql.'
'.mysql_error());
//déclaration de l'array
$jours_busy = array();
while ($event = mysql_fetch_array($req))
{
$jourbusy[] = array(
'event_date_debut' => $event['event_date_debut'],
'event_duree' => $event['event_duree']);

//jr début evt : si jr dbt evt est avt jour début mois, alors == jr début mois
$jrDbtEvt =intval(
(strtotime($event['event_date_debut']) < mktime(0, 0, 0, $_GET['m'], 1, $_GET['y']))
? date('d', mktime(0, 0, 0, $_GET['m'], 1, $_GET['y']))
: date('d',strtotime($event['event_date_debut']))
);
//jr fin mois
$jrFinMois = intval(date('d', mktime(00, 00, 00, $_GET['m']+1, 0, $_GET['y'])));
//timstp fin evt
$timstp_fin_evt = strtotime($event['event_date_debut'])+transfo_duree_en_secondes($event['event_duree']);
//timestamp fin mois
$timstp_fin_mois = mktime(00, 00, 00, $_GET['m']+1, 0, $_GET['y']);

//jr fin evt : si jr fin evt est après jour fin mois, alors == jr fin mois
$jrFinEvt =intval(
($timstp_fin_evt > $timstp_fin_mois)
? date('d',$timstp_fin_mois)
: date('d',$timstp_fin_evt)
);
//pr jr = jour dbt evt ; jr<fin_mois ; jr dbt +1
while(($jrDbtEvt <= $jrFinMois) AND ($jrDbtEvt <= $jrFinEvt))
{
//$jours_busy[]= $jrDbtEvt;
if(!in_array($jrDbtEvt,$jours_busy))
{
$jours_busy[]= $jrDbtEvt;
}
$jrDbtEvt++;
}
}
mysql_free_result ($req);

je pense que je vais finalement créer dans ma table une colonne de fin d'evenement directement, renseignée au moment de l'enregistrement, celà simplifiera mes requêtes.

Sujet résolu ! Merci Encore !
Commenter la réponse de 555clR