chevauchement de "période" (dates) et détection... - PHP - Programmation
Marsh Posté le 26-09-2003 à 13:59:37
hé ben, je vois que ma question inspire du monde...
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. 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 ? )
Marsh Posté le 26-09-2003 à 14:07:32
je sais
N designe le nouvel enregistrement a inserer
C l'enregistrement dans la base (de comparaison)
Code :
|
Marsh Posté le 26-09-2003 à 14:11:31
simogeo a écrit : je sais
|
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.
Marsh Posté le 26-09-2003 à 14:14:32
Hermes le Messager 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.
Marsh Posté le 26-09-2003 à 14:16:35
tetedeiench a écrit : |
On ne s'est pas compris.
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.
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à...
Marsh Posté le 26-09-2003 à 14:19:54
Hermes le Messager a écrit : |
Ben la tu détecte si ca se chevauche et si c'est dedans
C'est ce qu'il te faut, nan ?
Si tu veux vraiment pinailler :
Code :
|
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 |
Il suffit ensuite de vérifier que le count retourné est le même que :
Select |
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 |
Marsh Posté le 26-09-2003 à 14:22:21
donc il faut que les deux periodes n'aient aucun jour en commun exact?
Code :
|
edit: grilled
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.
Marsh Posté le 26-09-2003 à 14:24:15
Mara's dad a écrit : |
ben c'est ce que je dis
Marsh Posté le 26-09-2003 à 14:33:06
simogeo a écrit : |
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
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 ?
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'}
Marsh Posté le 26-09-2003 à 15:21:18
Azzazel a écrit : Moi j'utilise la fonction SQL between ... |
intéressant ça. Je connaissais pas.
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 =)
Marsh Posté le 26-09-2003 à 15:25:13
Azzazel a écrit : Moi j'utilise la fonction SQL between ... |
arfff j'avais utilisé ca pour un projet il y a un peu plus d'un an (SQLserver)
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.
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
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.
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