Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
688 connectés 

  FORUM HardWare.fr
  Programmation
  PHP

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

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

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

n°523881
Hermes le ​Messager
Breton Quiétiste
Posté le 26-09-2003 à 13:30:34  profilanswer
 

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
mood
Publicité
Posté le 26-09-2003 à 13:30:34  profilanswer
 

n°523927
Hermes le ​Messager
Breton Quiétiste
Posté le 26-09-2003 à 13:59:37  profilanswer
 

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
n°523935
simogeo
j'ai jamais tué de chats, ...
Posté le 26-09-2003 à 14:07:32  profilanswer
 

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
n°523938
Hermes le ​Messager
Breton Quiétiste
Posté le 26-09-2003 à 14:11:31  profilanswer
 

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

n°523941
Tetedeienc​h
Head Of God
Posté le 26-09-2003 à 14:14:32  profilanswer
 

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 !
n°523944
Hermes le ​Messager
Breton Quiétiste
Posté le 26-09-2003 à 14:16:35  profilanswer
 

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

n°523945
simogeo
j'ai jamais tué de chats, ...
Posté le 26-09-2003 à 14:18:18  profilanswer
 

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
n°523947
Tetedeienc​h
Head Of God
Posté le 26-09-2003 à 14:19:54  profilanswer
 

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 !
n°523950
Mara's dad
Yes I can !
Posté le 26-09-2003 à 14:21:07  profilanswer
 

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é.
n°523952
anapajari
s/travail/glanding on hfr/gs;
Posté le 26-09-2003 à 14:22:21  profilanswer
 

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
mood
Publicité
Posté le 26-09-2003 à 14:22:21  profilanswer
 

n°523953
Tetedeienc​h
Head Of God
Posté le 26-09-2003 à 14:22:35  profilanswer
 

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 !
n°523955
simogeo
j'ai jamais tué de chats, ...
Posté le 26-09-2003 à 14:24:15  profilanswer
 

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
n°523961
Mara's dad
Yes I can !
Posté le 26-09-2003 à 14:33:06  profilanswer
 

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é.
n°523967
simogeo
j'ai jamais tué de chats, ...
Posté le 26-09-2003 à 14:39:11  profilanswer
 

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
n°523979
Hermes le ​Messager
Breton Quiétiste
Posté le 26-09-2003 à 14:50:25  profilanswer
 

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

n°524000
Azzazel
Posté le 26-09-2003 à 15:07:41  profilanswer
 

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

n°524016
Hermes le ​Messager
Breton Quiétiste
Posté le 26-09-2003 à 15:21:18  profilanswer
 

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.

n°524017
Azzazel
Posté le 26-09-2003 à 15:23:46  profilanswer
 

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 =)

n°524019
simogeo
j'ai jamais tué de chats, ...
Posté le 26-09-2003 à 15:25:13  profilanswer
 

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
n°524045
Hermes le ​Messager
Breton Quiétiste
Posté le 26-09-2003 à 15:40:16  profilanswer
 

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

n°2037104
nanina00
Posté le 19-11-2010 à 10:45:42  profilanswer
 

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

mood
Publicité
Posté le   profilanswer
 


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  PHP

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

 

Sujets relatifs
recherche entre deux dates ?[Excel-VB] Recupération dates de modif de champ sur feuille annexe
[MySQL] Détection et suppression des redondances [résolu]Detection du plugin flash
[Access - VBA] je comprends plus rien aux INSERT INTO avec dates[CSS] chevauchement de divs
Detection de plug in[REGEX&PHP] Convertir les dates du format 2001-01-25 à du 25/01/2001 ?
comparaison de dates ASPProgrammation de periode de temps récurrente..
Plus de sujets relatifs à : chevauchement de "période" (dates) et détection...


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR