Requete qui ne retourne pas la date entourant

Résolu/Fermé
Marlocq Messages postés 117 Date d'inscription mardi 19 novembre 2013 Statut Membre Dernière intervention 10 septembre 2023 - 26 mars 2014 à 16:26
Reivax962 Messages postés 3671 Date d'inscription jeudi 16 juin 2005 Statut Membre Dernière intervention 11 février 2021 - 27 mars 2014 à 12:54
Bonjour,
Je fais des recherches sur des dates sur ma bdd mon soucis est que ma requete qui est sencée prendre les dates qui englobe ma recherche ne marche pas...

SELECT p1.date_deb_event, p1.date_fin_event, p1.description, p1.titre_event
FROM calendevent p1
WHERE date_deb_event <= '$datedebstr'
AND date_fin_event >= '$datedebstr'
OR date_deb_event < '$datefinstr'
AND date_fin_event > '$datefinstr'
OR date_deb_event >= '$datedebstr'
AND date_fin_event <= '$datefinstr'
OR date_deb_event < '$datedebstr'
AND date_fin_event > '$datefinstr'
ORDER BY date_fin_event DESC

Voila la requete. La dernière partie est sensé prendre les dates qui englobes celle de la recherche (cad : une recherche sur le mois de mars elle devrait me retourné les activiés qui commence avant mars et finisse après) mais ça ne le fais pas et j ai beau retourné le dernier or dans tout les sens je ne trouve pas la bonne formule....

11 réponses

Marlocq Messages postés 117 Date d'inscription mardi 19 novembre 2013 Statut Membre Dernière intervention 10 septembre 2023
26 mars 2014 à 16:38
Bonjour,

J ai testé avec les parenthèse ça ne change rien, ça retourne le même résultat avec ou sans
0
Utilisateur anonyme
26 mars 2014 à 16:40
Rebonjour

Regarde cette condition :
date_deb_event <= '$datedebstr'
AND date_fin_event >= '$datedebstr'
Tu as deux fois $datedebstr, je suppose que c'est involontaire.
Idem pour ta seconde condition

Et dans celle-ci :
date_deb_event < '$datedebstr'
AND date_fin_event > '$datefinstr'
Tu n'aurais pas inversé début et fin ?

Enfin, pour alléger l'écriture, utilise plutôt BETWEEN
0
Marlocq Messages postés 117 Date d'inscription mardi 19 novembre 2013 Statut Membre Dernière intervention 10 septembre 2023
26 mars 2014 à 16:46
pour la première et deuxième condition non c'est normal
le but est de prendre les dates situées des activités qui commencent soit pendant le mois soit qui finisse pendant
J'aurais pu faire faire date_deb_event <= '$datedebstr' <= date_fin_event
mais je ne sais pas si ça marche vu que je n'ai pas testé... et ça supprimerais juste le and si ça marche
Pour la dernière même en inversant ça ne retourne rien... :'(
0
Utilisateur anonyme
26 mars 2014 à 17:09
Pour la dernière même en inversant ça ne retourne rien
Je me rends compte que je ne sais pas en quoi consiste ton test, et je n'aurais pas dû te suggérer cette inversion.
0
Marlocq Messages postés 117 Date d'inscription mardi 19 novembre 2013 Statut Membre Dernière intervention 10 septembre 2023
26 mars 2014 à 17:19
la dernière doit me retourné les activités qui comment avant le mois de ma recherche et qui finissent après.
Pour être plus préçis. Je fais une recherche sur un mois donc le début du mois c'est le 01 du mois de l'année ->01/03/2014 par exemple
la fin ça donne 31/03/2014 pour le même exemple
La dernière condition qui étais la suivante
OR date_deb_event > '$datedebstr'
AND date_fin_event < '$datefinstr'
devait me permettre de retourné une date qui ferais 01/02/2014 au 01/04/2014 à titre d'exemple. Mais ça ne retourne rien...
0
Utilisateur anonyme
26 mars 2014 à 16:56
As-tu testé l'erreur éventuellement retournée par ta requête ?
As-tu affichée ta requête réelle après remplacement des variables par leurs valeurs ?
Si j'en crois ton script sur l'autre post, tu aurais plutôt dû utiliser les dates sous la forme aaaa-mm-jj, c'est à dire $datedeb, $datefin, etc. et non pas $datedebstr, $datefinstr
0
sipherion Messages postés 1798 Date d'inscription lundi 22 octobre 2007 Statut Membre Dernière intervention 19 décembre 2016 285
26 mars 2014 à 16:57
Et histoire d'être sûr, contentes toi de faire des tests sur une seule condition
WHERE date_deb_event <= '$datedebstr' AND date_fin_event >= '$datedebstr'
0
Marlocq Messages postés 117 Date d'inscription mardi 19 novembre 2013 Statut Membre Dernière intervention 10 septembre 2023
26 mars 2014 à 17:06
les dates sont toutes en valeur de seconde par exemple 1396216800 pour le 2014-3-31

Pour ce qui est des test j ai tester mes 4 paramètres de manière individuel. Les 3 premier retourne ce qu'ils doivent c'est à dire dans l'ordre:
si l'activité commence pendant le mois:
WHERE (date_deb_event <= '$datedebstr'
AND date_fin_event >= '$datedebstr')
Si l'activité fini pendant le mois:
OR (date_deb_event < '$datefinstr'
AND date_fin_event > '$datefinstr')
si l'activité commence et se fini dans le mois :
OR (date_deb_event >= '$datedebstr'
AND date_fin_event <= '$datefinstr')
et la dernière devrait me retourné l'activité si elle commence avant le mois et de se fini après, mais la le dernier point ne me retourne rien même en solo. Et je ne trouve pas comment allez cibler ce que je veux...
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Utilisateur anonyme
26 mars 2014 à 17:16
Attention, il ne faut pas passer de valeur en secondes, mais sous forme aaa-mm-jj.
MySQL interprète 1396216800 comme 1396-21-68 00h
0
Utilisateur anonyme
26 mars 2014 à 17:21
Depuis le début, je suppose que tes colonnes date_debut_event et date_fin_event sont de type DATE ou DATETIME. Si ce sont des INT, c'est toi qui as raison de mettre des secondes
0
Marlocq Messages postés 117 Date d'inscription mardi 19 novembre 2013 Statut Membre Dernière intervention 10 septembre 2023
26 mars 2014 à 17:23
Se sont des int
0
Je répère la question : as-tu affiché ta requête réelle après remplacement des variables par leurs valeurs ? (avec un simple echo)
Et Quand tu l'auras fait, peux-tu donner les valeurs date_deb_event et date_fin_event de ta table qui, d'après toi, auraient dû sortir ?
0
Marlocq Messages postés 117 Date d'inscription mardi 19 novembre 2013 Statut Membre Dernière intervention 10 septembre 2023
26 mars 2014 à 17:35
vu que les date_deb_event et date_fin_event sont les noms de table je ne peux pas les remplacer par des valeurs sauf sur le cas que ça devrait me retourné:
date_deb_devent = 1396389600 et date_fin_event = 1398808800
0
Utilisateur anonyme
26 mars 2014 à 17:41
Oui mais avec quelle requête ? tu peux bien faire un 'echo' de ta requête telle qu'elle est : PHP remplacera les variables par leurs valeurs. Tu ne vois pas ce que je veux dire ?
Tu as par exemple
$requete= "SELECT * FROM... WHERE (date_deb_event >= '$datedebstr'
AND date_fin_event <= '$datefinstr')";
Tu fais echo $requete; pour voir quelle est la vraie requête exécutée.
0
Marlocq Messages postés 117 Date d'inscription mardi 19 novembre 2013 Statut Membre Dernière intervention 10 septembre 2023
Modifié par Marlocq le 27/03/2014 à 09:57
SELECT p1.date_deb_event, p1.date_fin_event, p1.description, p1.titre_event FROM calendevent p1 WHERE date_deb_event <= '1393628400' AND date_fin_event >= '1393628400' OR date_deb_event < '1396216800' AND date_fin_event > '1396216800' OR date_deb_event >= '1393628400' AND date_fin_event <= '1396216800' OR date_deb_event < '1393628400' AND date_fin_event > '1396216800' ORDER BY date_fin_event DESC

Voila
0
Reivax962 Messages postés 3671 Date d'inscription jeudi 16 juin 2005 Statut Membre Dernière intervention 11 février 2021 1 011
27 mars 2014 à 10:25
Bonjour,

J'ai l'impression que tu mets trop de contraintes.
Pour moi il n'y a que deux cas possibles.
Tu as un intervalle de recherche [rd;rf]
- Soit la date de début de l'événement est antérieur à rd, dans ce cas l'événement est sélectionné ssi sa date de fin est postérieure à rd ;
- Soit la date de début de l'événement est postérieure à rd, dans ce cas l'événement est sélectionné ssi sa date de début est antérieure à rf.

Du coup ta requête devient :
SELECT p1.date_deb_event, p1.date_fin_event, p1.description, p1.titre_event
FROM calendevent p1
WHERE 
    date_deb_event <= '$datedebstr' AND date_fin_event >= '$datedebstr'
    OR date_deb_event >= '$datedebstr' AND date_deb_event <= '$datefinstr'
ORDER BY date_fin_event DESC 


En simplifiant ta requête, je pense que les erreurs éventuelles seront plus simples à retracer.
0
Il est normal que cette requête ne retourne pas la ligne date_deb_devent = 1396389600 et date_fin_event = 1398808800 car :
La première condition n'est pas satisfaite à cause de date_deb_event <= '1393628400'
La seconde condition n'est pas satisfaite à cause de date_deb_event < '1396216800'
La troisième condition n'est pas satisfaite à cause de date_fin_event <= '1396216800'
et la quatrième n'est pas satisfaite à cause de date_deb_event < '1393628400'

As-tu un autre exemple ? Car pour l'instant je ne vois pas de problème

Dans un premier temps, suis le conseil de sipherion et fais ton test avec une condition plus simple que tu vérifieras plus facilement.
0
Marlocq Messages postés 117 Date d'inscription mardi 19 novembre 2013 Statut Membre Dernière intervention 10 septembre 2023
27 mars 2014 à 11:04
Pour répondre à le père, j ai testé toute une par une pour voir ce que ça retournais et juste la dernière ou je ne trouve pas de solution pour le moment.

Pour reivax ta solution me permet de récupéré celle qui comment avant finissent pendant celle qui comment pendant et finisse après et enfin celle qui sont dans le mois. Donc il me manque toujours les activités qui englobe mon mois de recherche.

Sinon pour faire mon code j'ai travaillé comme suite:
4 cas figure :
1 commence avant fini pendant
2 commence pendant fini après
3 commence et se termine pendant
4 commence avant et fini après (donc englobe)
une fois ça fait j ai fait un tableau en partant d'une recherche sur mars

Fevrier | Mars | Avril
avant | pendant |
| pendant | après
| dedans |
avant | | après

d'où les 4 contraintes

ce qui me fait en code ce que vous avez vu
SELECT p1.date_deb_event, p1.date_fin_event, p1.description, p1.titre_event
FROM calendevent p1
WHERE date_deb_event <= '$datedebstr'
AND date_fin_event >= '$datedebstr' en 1
OR date_deb_event < '$datefinstr'
AND date_fin_event > '$datefinstr' en 2
OR date_deb_event >= '$datedebstr'
AND date_fin_event <= '$datefinstr' en 3
OR date_deb_event < '$datedebstr'
AND date_fin_event > '$datefinstr' en 4 mais ça ne va pas...
0
Reivax962 Messages postés 3671 Date d'inscription jeudi 16 juin 2005 Statut Membre Dernière intervention 11 février 2021 1 011
Modifié par Reivax962 le 27/03/2014 à 12:57
Faux.
Si elles englobent le mois de recherche, alors
date_deb_event <= '$datedebstr' AND date_fin_event >= '$datedebstr'
est validé.

Je réaffirme que deux contraintes suffisent, en mettre plus complexifie le code, ce qui augmente les risques de bug.

(Attention, ce n'est vrai qu'en partant du principe que les dates de fin sont postérieures aux dates de début...)
0
Dans l''exemple que tu donnes, tu fais une recherche sur le mois de mars. Or, la ligne de ta base qui devrait sortir d'après toi concerne la période du 2 au 30 avril. C'est normal qu'elle ne sorte pas, puisqu'elle est entièrement après la période de recherche.
Peux-tu nous donner un VRAI exemple de valeurs de début et de fin de la période de recherche, et les date_deb_event et date_fin_event qui devraient sortir ?
Car à mon avis, tout est correct, il n'y a tout simplement pas de réponse.
0
Marlocq Messages postés 117 Date d'inscription mardi 19 novembre 2013 Statut Membre Dernière intervention 10 septembre 2023
27 mars 2014 à 11:59
2014-3-1--1393628400-- 2014-3-31--1396216800--

SELECT p1.date_deb_event, p1.date_fin_event, p1.description, p1.titre_event FROM calendevent p1 WHERE date_deb_event <= '1393628400' AND date_fin_event >= '1393628400' OR date_deb_event >= '1393628400' AND date_deb_event <= '1396216800' ORDER BY date_fin_event DESC

Retester avec la commande de Reivax et ça marche enfin... Maintenant je vais analyser ça pour voir pourquoi ça commande recoupe les 4 cas.

Merci à tous pour votre aide, sans vous je pense que sans vous je serais encore dessus
0
sipherion Messages postés 1798 Date d'inscription lundi 22 octobre 2007 Statut Membre Dernière intervention 19 décembre 2016 285
Modifié par sipherion le 26/03/2014 à 16:30
Bonjour,

Il te faut des parenthèses pour que SQL distingue tes OR et tes AND.

WHERE (date_deb_event <= '$datedebstr'
AND date_fin_event >= '$datedebstr')
OR (date_deb_event < '$datefinstr'
AND date_fin_event > '$datefinstr')
OR (date_deb_event >= '$datedebstr'
AND date_fin_event <= '$datefinstr')
OR (date_deb_event < '$datedebstr'
AND date_fin_event > '$datefinstr')

"Il vaut mieux savoir tout chercher que chercher à tout savoir."
"Internet est en fait l'acronyme de : Imprévisible Noctambule Transportant un Ensemble de Ragots et de Nouvelles Eminemment Triviales"
-1
Utilisateur anonyme
26 mars 2014 à 16:36
Bonjour

Inutile, le AND a la priorité sur le OR
0