Partage
  • Partager sur Facebook
  • Partager sur Twitter

Formulation de la requête qui me pose problème

Une condition que je ne vois pas comment faire

Sujet résolu
    30 juillet 2010 à 17:56:59

    Bonjour

    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
    • Partager sur Facebook
    • Partager sur Twitter
    Dommage, impossible de mettre ma signature
      30 juillet 2010 à 18:15:48

      Salut,

      Tu peux utiliser NOT BETWEEN dans ta clause WHERE. Par exemple :

      WHERE date_evenement NOT BETWEEN 'date début' AND 'date fin'
      
      • Partager sur Facebook
      • Partager sur Twitter
        30 juillet 2010 à 18:19:05

        Pourquoi tu utilises TIMESTAMP au lieu du type normal qui est DATETIME ? (attention avec le type TIMESTAMP c'est le boxon)

        http://dev.mysql.com/doc/refman/5.0/en/timestamp.html
        • Partager sur Facebook
        • Partager sur Twitter
          30 juillet 2010 à 18:26:36

          Citation : Lord Casque Noir

          Pourquoi tu utilises TIMESTAMP au lieu du type normal qui est DATETIME ? (attention avec le type TIMESTAMP c'est le boxon)

          http://dev.mysql.com/doc/refman/5.0/en/timestamp.html



          Relis ce que j'ai écris, ce n'est pas moi qui est conçu ce programme à la base mais un stagiaire!

          Ensuite pour le NOT BETWEEN, j'ai 2 dates (debut et fin). Sur lequel appliquer?
          Merci pour vos réponses.


          lemirandais
          • Partager sur Facebook
          • Partager sur Twitter
          Dommage, impossible de mettre ma signature
            30 juillet 2010 à 18:32:34

            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.
            • Partager sur Facebook
            • Partager sur Twitter
              30 juillet 2010 à 18:34:23

              Citation : BlueRat

              C'est bizarre mettre un type TIMESTAMP et un format par défault en DATETIME.


              Oui mais c'est pas moi qui fait cela. Je cherche à faire fonctionner ma requete.

              lemirandais
              • Partager sur Facebook
              • Partager sur Twitter
              Dommage, impossible de mettre ma signature
                30 juillet 2010 à 18:58:35

                > s'il y a un rdv entre le créneau que j'ai.

                C'est l'intersection de deux intervalles.

                Sinon change tes timestamps en datetime, ça t'évitera d'avoir des surprises aux changements d'heures XD
                • Partager sur Facebook
                • Partager sur Twitter
                  30 juillet 2010 à 19:08:02

                  Citation : Lord Casque Noir

                  > s'il y a un rdv entre le créneau que j'ai.

                  C'est l'intersection de deux intervalles.

                  Sinon change tes timestamps en datetime, ça t'évitera d'avoir des surprises aux changements d'heures XD



                  Est ce qu'en changeant les 2 champs, je vais perdre les données déjà enregistré? J'ai 12000 enregistrements présents dans la table?
                  • Partager sur Facebook
                  • Partager sur Twitter
                  Dommage, impossible de mettre ma signature
                    30 juillet 2010 à 19:25:27

                    Citation : lemirandais

                    Est ce qu'en changeant les 2 champs, je vais perdre les données déjà enregistré? J'ai 12000 enregistrements présents dans la table?



                    Normalement non, mais fais une sauvegarde...

                    Ca donne quoi les intervalles ?
                    • Partager sur Facebook
                    • Partager sur Twitter
                      30 juillet 2010 à 20:06:24

                      Citation : Lord Casque Noir

                      Citation : lemirandais

                      Est ce qu'en changeant les 2 champs, je vais perdre les données déjà enregistré? J'ai 12000 enregistrements présents dans la table?



                      Normalement non, mais fais une sauvegarde...

                      Ca donne quoi les intervalles ?



                      Je travaille déjà en local, donc je viens de tester et le changement n'a rien produit comme problème.
                      Maintenant, faut que je fasse la requête!
                      • Partager sur Facebook
                      • Partager sur Twitter
                      Dommage, impossible de mettre ma signature
                      Anonyme
                        30 juillet 2010 à 21:03:49

                        Salut,

                        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)
                        

                        :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.
                        • Partager sur Facebook
                        • Partager sur Twitter
                          30 juillet 2010 à 21:27:34

                          Citation : Enax

                          Salut,

                          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)
                          


                          :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.

                          Merci encore pour votre aide.
                          • Partager sur Facebook
                          • Partager sur Twitter
                          Dommage, impossible de mettre ma signature
                            1 août 2010 à 20:16:44

                            salut!
                            il y a la clause "INTERVAL" pour les types dates!
                            sinon ferme la 2eme parenthèse dans ta requete!
                            • Partager sur Facebook
                            • Partager sur Twitter

                            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.
                            • Editeur
                            • Markdown