chevauchement de "période" (dates) et détection...

chevauchement de "période" (dates) et détection... - PHP - Programmation

Marsh Posté le 26-09-2003 à 13:30:34    

Dans le cadre de la réalisation d'un calendrier, je me retrouve confronté à un petit problème (en fait, je sais faire, mais je me demande s'il n'y a pas une meilleure solution).
 
J'ai dans une table "calendrier" plusieurs champs dont deux : date_debut_repet et date_fin_repet.  :D  
 
Quand je veux entrer une nouvelle "periode" de repet, je dois controler que celle-ci n'est pas "à cheval" sur une période déjà existante.  :)  
 
Quelle est d'après vous la meilleure solution ?


Message édité par Hermes le Messager le 26-09-2003 à 14:01:52
Reply

Marsh Posté le 26-09-2003 à 13:30:34   

Reply

Marsh Posté le 26-09-2003 à 13:59:37    

hé ben, je vois que ma question inspire du monde...  [:totozzz]  
 
Pour le moment je fais comme ceci :
 
je teste les périodes de répétition entrée une par une dans un while, et :
 
si new_date_debut < date_debut_test && new_date_fin < date_fin_test
 
or  
 
new_date_debut > date_debut_test && new_date_fin > date_fin_test
 
 
alors, c'est OK.  :D  sinon, pas bon --> erreur : pas possible deux période à cheval l'une sur l'autre.
Une autre soluce (peut-être même directement dans la requête ?  :whistle: )


Message édité par Hermes le Messager le 26-09-2003 à 14:00:16
Reply

Marsh Posté le 26-09-2003 à 14:07:32    

je sais [:dawa]
 
N designe le nouvel enregistrement a inserer
C l'enregistrement dans la base (de comparaison)
 

Code :
  1. si (N.Datedebut>C.DateFin || N.DateFin < C.DateDébut) {
  2.   //je fais mon INSERT de cowboy
  3. }
  4. sinon {
  5.    // ca se chevauche
  6. }


---------------
from here and there -- \o__________________________________ -- la révolution de la terre, en silence
Reply

Marsh Posté le 26-09-2003 à 14:11:31    

simogeo a écrit :

je sais [:dawa]
 
N designe le nouvel enregistrement a inserer
C l'enregistrement dans la base (de comparaison)
 

Code :
  1. si (N.Datedebut>C.DateFin || N.DateFin < C.DateDébut) {
  2.   //je fais mon INSERT de cowboy
  3. }
  4. sinon {
  5.    // ca se chevauche
  6. }




 
Non, c'est pas bon, car avec ton système, une répète du 15-01-2003 au 25-01-2003 peut être comprise dans une autre répète du 01-01-2003 au 31-01-2003.  :o  :D

Reply

Marsh Posté le 26-09-2003 à 14:14:32    

Hermes le Messager a écrit :


 
Non, c'est pas bon, car avec ton système, une répète du 15-01-2003 au 25-01-2003 peut être comprise dans une autre répète du 01-01-2003 au 31-01-2003.  :o  :D  


 
ben c le cas, nan ?
 
la période du 15 janvier au 25 janvier 2003 est bien dans la répète du 1er janvier 2003 au 31 Janvier 2003.
 
le monsieur il a tout a fait raison.


---------------
L'ingénieur chipset nortiaux : Une iFricandelle svp ! "Spa du pâté, hin!" ©®Janfynette | "La plus grosse collec vivante de bans abusifs sur pattes" | OCCT v12 OUT !
Reply

Marsh Posté le 26-09-2003 à 14:16:35    

tetedeiench a écrit :


 
ben c le cas, nan ?
 
la période du 15 janvier au 25 janvier 2003 est bien dans la répète du 1er janvier 2003 au 31 Janvier 2003.
 
le monsieur il a tout a fait raison.


 
On ne s'est pas compris.  :jap:  
 
Une période de répétition ne peut pas se trouver DANS une autre période de répétition. Non seulement elles ne doivent pas se chevaucher, mais en plus, elles ne peuvent pas non plus se "contenir" les unes les autres.  :D

Reply

Marsh Posté le 26-09-2003 à 14:18:18    

ben nan ...... :??:  .. enfin je crois pas ..... mais j'ai pas le temps de reflechir dessus là... :sweat:


---------------
from here and there -- \o__________________________________ -- la révolution de la terre, en silence
Reply

Marsh Posté le 26-09-2003 à 14:19:54    

Hermes le Messager a écrit :


 
On ne s'est pas compris.  :jap:  
 
Une période de répétition ne peut pas se trouver DANS une autre période de répétition. Non seulement elles ne doivent pas se chevaucher, mais en plus, elles ne peuvent pas non plus se "contenir" les unes les autres.  :D  


 
Ben la tu détecte si ca se chevauche et si c'est dedans :D
 
C'est ce qu'il te faut, nan ?
 
Si tu veux vraiment pinailler :
 

Code :
  1. si (N.Datedebut>C.DateFin && N.DateFin < C.DateDébut) {
  2. //C'est dedans
  3. sinon {
  4.   si (N.Datedebut>C.DateFin || N.DateFin < C.DateDébut) {
  5.   // ca se chevauche ou c'est dedans mais c pas dedans on a testé avant donc ca peut que ce chevaucher
  6.   }
  7.   sinon
  8.   {
  9.    //INSERT de geronimo
  10.   }
  11. }


Message édité par Tetedeiench le 26-09-2003 à 14:20:57

---------------
L'ingénieur chipset nortiaux : Une iFricandelle svp ! "Spa du pâté, hin!" ©®Janfynette | "La plus grosse collec vivante de bans abusifs sur pattes" | OCCT v12 OUT !
Reply

Marsh Posté le 26-09-2003 à 14:21:07    

Ben oui, c'est directement dans la requête qu'il faut te poser la question du chevauchement.
 
En fait, il N'Y A PAS chevauchement, si et seulement si,  
 
new_date_fin < date_debut
OR
new_date_debut > date_fin
 
Donc une requete qui test si la période new n'en chevauche pas une autre sera de la forme :
 

Select
 count(*)
from
 calendrier
where  
 new_date_fin < date_debut_repet
 OR new_date_debut > date_fin-repet


 
Il suffit ensuite de vérifier que le count retourné est le même que :

Select
 count(*)
from
 calendrier


 
C'est le plus simple à mon avis.
 
Sinon, pour faire une requête qui détecte les collisions, çà devient tout de suite plus compliqué, mais çà donne :
 

Select
 count(*)
from
 calendrier
where  
 ( new_date_debut >= date_debut_repet AND new_date_fin <= date_debut_repet )
 OR
 ( new_date_debut < date_debut_repet AND new_date_fin >= date_debut_repet AND new_date_fin <= date_fin_repet )
 OR
 ( new_fin_debut > date_fin_repet AND new_date_debut <= date_fin_repet AND new_date_debut >= date_debut_repet )


---------------
Laissez l'Etat dans les toilettes où vous l'avez trouvé.
Reply

Marsh Posté le 26-09-2003 à 14:22:21    

donc il faut que les deux periodes n'aient aucun jour en commun exact?

Code :
  1. if ( ( date_fin1 < date_debut2 ) || ( date_fin2 < date_debut1 ) )
  2. {
  3. // ça se chevauche pas
  4. }
  5. else
  6. {
  7. // ça se chevauche
  8. }


 
edit: grilled


Message édité par anapajari le 26-09-2003 à 14:22:50
Reply

Marsh Posté le 26-09-2003 à 14:22:21   

Reply

Marsh Posté le 26-09-2003 à 14:22:35    

Je suis assez clair :??:
 
Si les deux dates (début et fin) de la nouvelle période sont dans l'ancienne, alors la nouvelle période est dans l'ancienne.
SINON ( important)
 si l'une des deux dates de la nouvelle est dans l'ancienne période ( y en a pas deux, on le sait, on a testé avant), alors ca se chevauche
 SINON
  ben ca se chevauche pas et c pas dedans.


---------------
L'ingénieur chipset nortiaux : Une iFricandelle svp ! "Spa du pâté, hin!" ©®Janfynette | "La plus grosse collec vivante de bans abusifs sur pattes" | OCCT v12 OUT !
Reply

Marsh Posté le 26-09-2003 à 14:24:15    

Mara's dad a écrit :


new_date_fin < date_debut
OR
new_date_debut > date_fin


ben c'est ce que je dis  [:spamafote]


---------------
from here and there -- \o__________________________________ -- la révolution de la terre, en silence
Reply

Marsh Posté le 26-09-2003 à 14:33:06    

simogeo a écrit :


ben c'est ce que je dis  [:spamafote]  


 
Oui, mais tu le fait comment ton test !
Il faut le faire pour tous les records de la base pour vérifier qu'ils sont tous OK pour la non-collision.
 
Donc soit tu compte comme je l'ai montré, soit tu cherche une collision (plus compliqué), et tu te dis que tout va bien si y'en à pas :)


---------------
Laissez l'Etat dans les toilettes où vous l'avez trouvé.
Reply

Marsh Posté le 26-09-2003 à 14:39:11    

a ok  :)  .... enfin moi je pensais qu'il voulait que l'algo
 
d'apres toi quelle est la formule la moins gourmande en temps d'execution ? la plus simple avec les 2 requetes ou la detection de collision ?


Message édité par simogeo le 26-09-2003 à 14:39:24

---------------
from here and there -- \o__________________________________ -- la révolution de la terre, en silence
Reply

Marsh Posté le 26-09-2003 à 14:50:25    

Merci bien pour vos réflexions.  :jap:  :jap:

Reply

Marsh Posté le 26-09-2003 à 15:07:41    

Moi j'utilise la fonction SQL between ...
 
SELECT id FROM table WHERE date_test BETWEEN {d '$date1'} and {d '$date2'}

Reply

Marsh Posté le 26-09-2003 à 15:21:18    

Azzazel a écrit :

Moi j'utilise la fonction SQL between ...
 
SELECT id FROM table WHERE date_test BETWEEN {d '$date1'} and {d '$date2'}


 
intéressant ça.  :)  Je connaissais pas.

Reply

Marsh Posté le 26-09-2003 à 15:23:46    

Oui enfin je ne sais pas si ça va te faire gagner en temps d'exécution ... mais bon elle a le mérite d'exister =)

Reply

Marsh Posté le 26-09-2003 à 15:25:13    

Azzazel a écrit :

Moi j'utilise la fonction SQL between ...
 
SELECT id FROM table WHERE date_test BETWEEN {d '$date1'} and {d '$date2'}


arfff :pt1cable:  j'avais utilisé ca pour un projet il y a un peu plus d'un an (SQLserver)


---------------
from here and there -- \o__________________________________ -- la révolution de la terre, en silence
Reply

Marsh Posté le 26-09-2003 à 15:40:16    

Azzazel a écrit :

Oui enfin je ne sais pas si ça va te faire gagner en temps d'exécution ... mais bon elle a le mérite d'exister =)


 
Ce n'est pas très grave, vu que j'efface automatiquement tout ce qui dépasse en dessous de la date du jour à chaque requète pour l'affichage. ;) De plus, il n'y aura jamais plus de 500 ou 1000 enregistrements.  :)

Reply

Marsh Posté le 19-11-2010 à 10:45:42    

Bonjour à tous,
 
Je viens avec ma requête qui  ne me donne pas le résultat escompté. Au fait, dans ma table reservation j'ai une salle qui est réservée pour la période du 18.11.10 au 18.11.10. Avec select * from reservation; // Ok j'arrive à trouver la salle n°3 mais malheureusement pas avec la requête qui suit:
 
select count(RESERVATION.id) as compte from RESERVATION where ( (to_date('18/11/10','dd.mm.yy') between RESERVATION.debut  and  RESERVATION.fin) or  (to_date('18/11/10','dd.mm.yy') between RESERVATION.debut  and  RESERVATION.fin )) and RESERVATION.salle ='salle3';
 
Voici la structure de ma table:
Create table RESERVATION
(
  id number(10) not null,  
  debut date not null,  
  fin date not null,  
  salle varchar2(100 char) not null,
  details varchar2(100 char) not null
);
 
Je dois faire la recherche avant d'insérer une nouvelle réservation. Je suis sous Oracle et java.
Je trouve que la requête postée par Mara's dad correspond bien au mien mais je sais pourquoi?
 
Merci d'avance pour aide

Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed