Je suis en train d'ajouter une fonctionnalité à un programme réaliser par un autre développeur qui était en stage dans la boite où je bosse. Il s'agit d'un agenda, il marche assez bien sauf il manque une fonctionnalité indispensable, la vérification des évènements, en gros ne pas enregistrer un rendez vous dans le même créneau d'horaire.
J'ai donc décidé de l'ajouter mais j'ai un problème pour réaliser la fin de ma requete.
Voici la table qui me pose problème:
CREATE TABLE IF NOT EXISTS `evenement` (
`id_evenement` int(11) NOT NULL auto_increment,
`agenda_id` int(11) NOT NULL,
`objet` varchar(255) collate utf8_unicode_ci NOT NULL,
`description` longtext collate utf8_unicode_ci NOT NULL,
`debut` timestamp NOT NULL default '0000-00-00 00:00:00',
`fin` timestamp NOT NULL default '0000-00-00 00:00:00',
PRIMARY KEY (`id_evenement`),
KEY `agenda_id` (`agenda_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=875
Je n'arrive pas, avec cette table à faire mon WHERE. En fait je veux vérifier dans la base de donnée, s'il y a un rdv entre le créneau que j'ai.
Voici ma requete:
<?php
$requete="SELECT * FROM evenement
LEFT JOIN agenda ON agenda.id_agenda=evenement.agenda_id
WHERE
( agenda.user_id ='19'
AND evenement.debut>='".$datedepart."'
AND evenement.fin=<'".$datefin."')";
?>
Il faut donc vérifier si durant le créneau d'horaire en question, il y a un evenement entre, ou un évenement qui comment mais ne fini pas ou un évènement qui fini durant ce créneau.
Pourriez vous m'aider svp?
Merci d'avance
C'est plutôt BETWEEN et pas NOT BETWEEN qu'il veut faire ici non ? En tout cas tel que c'est écrit dans la requête.
Ca t'affiche une erreur ou autre?
Je pense que le problème doit venir du format de la date dans la comparaison.
Si j'ai bien compris, le but de ta requête est de savoir s'il existe déjà des rdv sur la plage horaire d'un nouveau rdv que tu es sur le point de créer ?
SELECT
count(*)
FROM
evenement e
LEFT JOIN agenda a ON a.id_agenda = e.agenda_id
WHERE
a.user_id = :userId
AND (e.debut BETWEEN :dateDebut AND :dateFin
OR e.fin BETWEEN :dateDebut AND :dateFin)
Où :dateDebut et :dateFin sont les dates de ton nouvel événement.
Je n'ai plus de serveur de db sur mon PC pour tester, mais ça devrait être quelque chose comme ça.
Si j'ai bien compris, le but de ta requête est de savoir s'il existe déjà des rdv sur la plage horaire d'un nouveau rdv que tu es sur le point de créer ?
SELECT
count(*)
FROM
evenement e
LEFT JOIN agenda a ON a.id_agenda = e.agenda_id
WHERE
a.user_id = :userId
AND (e.debut BETWEEN :dateDebut AND :dateFin
OR e.fin BETWEEN :dateDebut AND :dateFin)
Où :dateDebut et :dateFin sont les dates de ton nouvel événement.
Je n'ai plus de serveur de db sur mon PC pour tester, mais ça devrait être quelque chose comme ça.
Ta solution résoud en partie mon problème.
Il détecte les rdv :
dans le créneau d'horaire
ayant un horaire de départ présent dans le créneau horaire
ayant un horaire de fin présent dans le créneau horaire
Par contre il ne détecte pas les horaires de rendez vous pour lequel le créneau horaire est plus petit qu'un rdv enregistrer.
Ex: le rdv début à 8h et fini à 12h, et que je souhaite enregistrer un rdv de 9h à 10h.
Est ce possible?
Merci beaucoup pour ton aide.
lemirandais
Bon ben sa fonctionne à 100%, voici la requête finale et qui fonctionne:
<?php
$requete="SELECT
count(*)
FROM
evenement e
LEFT JOIN agenda a ON a.id_agenda = e.agenda_id
WHERE
a.user_id = '1'
AND (e.debut BETWEEN '".$datedepart."' AND '".$datefin."'
OR e.fin BETWEEN '".$datedepart."' AND '".$datefin."'
OR (e.debut<'".$datedepart."' AND e.fin>'".$datefin."')
?>
Dites moi si elle peut être optimiser encore plus.
salut!
il y a la clause "INTERVAL" pour les types dates!
sinon ferme la 2eme parenthèse dans ta requete!
Formulation de la requête qui me pose problème
× Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
× Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.