PHP|Débutant :: Forums

Advertisement

Besoin d'aide ? N'hésitez pas, mais respectez les règles

Vous n'êtes pas identifié(e).

#1 26-04-2010 22:54:34

rick's
Membre
Inscription : 26-04-2010
Messages : 14

Selectionner les enregistrement SQL situé entre 2009-10 et 2010-09

Bonjour,

Je souhaite sélectionner tous les enregistrements d'une table se situant entre deux date du type énoncé dans le sujet.

je ne peux pas changer la syntaxe de ces enregistrements et dans la base le type est de forme varchar.

J'ai essayé plusieurs possibilités sans succès (en utilisant les opérateur >= et =< ainsi que la commande between), mais rien de tout ça fonctionne...

Avez vous une idée?

Cordialement,
Eric

Hors ligne

#2 27-04-2010 05:47:52

Maljuna Kris
Infantimigulo
Lieu : Douarnenez 29100 Breizh Izel
Inscription : 08-05-2009
Messages : 2 453
Site Web

Re : Selectionner les enregistrement SQL situé entre 2009-10 et 2010-09

Saluton,
Je ne vois pas pourquoi

WHERE nomdelacolonne BETWEEN '2009-09' AND '2009-10'

ne fournirait pas le résultat escompté.
En se rappelant que BETWEEN inclut les bornes.


Gloire à qui n'ayant pas d'idéal sacro-saint,
Se borne à ne pas trop emmerder ses voisins. G. Brassens Don Juan 1976.
Avĉjo MoKo kantas
La chaîne YouTube MoKo Papy

Hors ligne

#3 27-04-2010 10:45:44

rick's
Membre
Inscription : 26-04-2010
Messages : 14

Re : Selectionner les enregistrement SQL situé entre 2009-10 et 2010-09

Salut Majuna,

voici ma requête exacte :

$sqlReports='SELECT * FROM reports WHERE period BETWEEN "'.$_COOKIE['yearToWork'].'-'.$exerciceStartMonth.'" AND "2010-12" ORDER BY period';

elle ne me retourne rien, malgrès la présence de mes enregistrements

Cordialement,
Eric

Hors ligne

#4 27-04-2010 11:40:23

xTG
GrandGourou
Inscription : 18-06-2009
Messages : 1 127
Site Web

Re : Selectionner les enregistrement SQL situé entre 2009-10 et 2010-09

Essayes d'intervertir tes quotes. Les doubles quotes influent peut être sur l'exploitation de la date par le sgbd.

Hors ligne

#5 27-04-2010 12:58:14

rick's
Membre
Inscription : 26-04-2010
Messages : 14

Re : Selectionner les enregistrement SQL situé entre 2009-10 et 2010-09

xTG a écrit :

Essayes d'intervertir tes quotes. Les doubles quotes influent peut être sur l'exploitation de la date par le sgbd.

Changement effectué, rien de mieux....

Hors ligne

#6 28-04-2010 17:06:53

rick's
Membre
Inscription : 26-04-2010
Messages : 14

Re : Selectionner les enregistrement SQL situé entre 2009-10 et 2010-09

Toujours pas d'idée?

Hors ligne

#7 28-04-2010 18:18:18

xTG
GrandGourou
Inscription : 18-06-2009
Messages : 1 127
Site Web

Re : Selectionner les enregistrement SQL situé entre 2009-10 et 2010-09

Euh à tout hasard, que donnes l'affichage de $sqlReports ?

Hors ligne

#8 28-04-2010 19:32:45

Jc
Membre
Lieu : Zillisheim - Alsace
Inscription : 15-04-2010
Messages : 1 629
Site Web

Re : Selectionner les enregistrement SQL situé entre 2009-10 et 2010-09

Bonjour,

Moi je commencerais par licencier le concepteur de la base de données qui à eu l'idée (géniale? ^^) de définir des dates en varchar.
Promis, je me penche sur la question (faut dire aussi hein qu'on fait ca tous les jours smile )


POO PHP+Ajax en MVC avec PDO et Bases de données épaisses  : What else?

Hors ligne

#9 28-04-2010 19:47:50

xTG
GrandGourou
Inscription : 18-06-2009
Messages : 1 127
Site Web

Re : Selectionner les enregistrement SQL situé entre 2009-10 et 2010-09

Arf c'était pourtant si évident... x)

Hors ligne

#10 28-04-2010 23:33:24

Jc
Membre
Lieu : Zillisheim - Alsace
Inscription : 15-04-2010
Messages : 1 629
Site Web

Re : Selectionner les enregistrement SQL situé entre 2009-10 et 2010-09

Re bonjour,

J'ai besoin de savoir sous quel format les dates sont stockées (jj/mm/aaaa ou aaa-mm-jj etc..., si les heures HH:mm:ss, etc... sont incluses et comment. En résumé donne moi le masque de stockage de tes dates stp.

Dernière modification par Jc (28-04-2010 23:33:36)


POO PHP+Ajax en MVC avec PDO et Bases de données épaisses  : What else?

Hors ligne

#11 28-04-2010 23:41:20

Pierrot
Ancien nouveau
Inscription : 08-05-2009
Messages : 1 195

Re : Selectionner les enregistrement SQL situé entre 2009-10 et 2010-09

>>Moi je commencerais par licencier le concepteur de la base de données qui à eu l'idée (géniale? ^^) de définir des dates en varchar.

d'accord et pas d'accord wink

même si elles sont stockée en varchar, sa requête doit lui ramener les bons enregistrements wink

a++

Hors ligne

#12 29-04-2010 06:01:14

xTG
GrandGourou
Inscription : 18-06-2009
Messages : 1 127
Site Web

Re : Selectionner les enregistrement SQL situé entre 2009-10 et 2010-09

Tu es sûr que le between fonctionne avec les caractères ? Il me semblait que cela ne fonctionnait que pour les nombres et les dates.

Hors ligne

#13 29-04-2010 08:41:33

Pierrot
Ancien nouveau
Inscription : 08-05-2009
Messages : 1 195

Re : Selectionner les enregistrement SQL situé entre 2009-10 et 2010-09

extrait de la doc mysql :
>>SELECT 'b' BETWEEN 'a' AND 'c';
>>Ceci est équivalent à l'expression (min <= expression AND expression <= max)

a++

Hors ligne

#14 30-04-2010 22:33:10

Jc
Membre
Lieu : Zillisheim - Alsace
Inscription : 15-04-2010
Messages : 1 629
Site Web

Re : Selectionner les enregistrement SQL situé entre 2009-10 et 2010-09

Bonsoir,

Visiblement le problème posé n'est pas très urgent à résoudre car je n'ai toujours pas de réponse. Donc je m'en tiendrais à ça:
1) Pierrot à raison ca doit marcher, mais c'est pas du 100% car ca dépends tout de même du masque de stockage et celui de comparaison ainsi que de la plage recherché dans la comparaison.
2) Utilise la même syntaxe dans ton between que celle de stockage dans ton varchar à 100% (niveau longueur) ca augmentera tes chances de matcher à 100%.
3) donc si dans ce que tu as besoin tu as la chance que ca colle tant mieux, sinon faut utiliser CAST() et/où STR_TO_DATE() pour arriver à tes fins.*
4) Et enfin si tu n'es pas très exigeant sur les plages de valeur retournées tu peux forcer un résultat en faisant un BETWEEN  'une valeur' and now(). Ici le now() forcera la conversion implicite par le moteur de 'une valeur' en date, et si il est incorrect ou non adapté au contexte, sera considéré comme null et donc à la date origine du système de date du SGBDR.... te restera plus qu'un ORDER...ASC/DESC avec le LIMIT pour trier un peu tout ça.
5) la meilleure recommandation que je puisse te faire c'est d'utiliser le masque de date par défaut du moteur c'est à dire 2010-xx-yy  (xx : mois et yy : jour) dans tes varchar, car ca optimisera tes chances de matcher sur les comparaisons chaines même partielles (du style '2010-05') car les valeurs les plus variables (jours puis mois) ne sont pas placées en début de chaine mais de façon optimisée (jours en dernier).

Bonne continuation dans la résolution de ton problème.

Dernière modification par Jc (30-04-2010 22:44:23)


POO PHP+Ajax en MVC avec PDO et Bases de données épaisses  : What else?

Hors ligne

#15 02-05-2010 23:28:22

rick's
Membre
Inscription : 26-04-2010
Messages : 14

Re : Selectionner les enregistrement SQL situé entre 2009-10 et 2010-09

Salut,

je rentre juste de déplacement et ouahaou, qu'elle activité tongue

le $sqlReport me donne : SELECT * FROM reports WHERE period BETWEEN '2010-04' AND '2010-12' ORDER BY period

Le concepteur c'est moi tongue et on peut pas me viré je suis mon propre patron tongue

à l'origine je souhaitai définir un mois, c'est pour ça que j'ai pris ce type d'enregistrement, qui me semblai sur le coup plus approprié...


la date est sous forme yyyy-mm

Merci de vous êtes tous attardé à mon soucis (qui persistent)

Hors ligne

#16 02-05-2010 23:38:40

rick's
Membre
Inscription : 26-04-2010
Messages : 14

Re : Selectionner les enregistrement SQL situé entre 2009-10 et 2010-09

Même problème avec

SELECT * FROM reports WHERE period BETWEEN STR_TO_DATE('2010-04') AND STR_TO_DATE('2010-12') ORDER BY period

...

Hors ligne

#17 03-05-2010 00:46:53

Jc
Membre
Lieu : Zillisheim - Alsace
Inscription : 15-04-2010
Messages : 1 629
Site Web

Re : Selectionner les enregistrement SQL situé entre 2009-10 et 2010-09

Bonsoir,

Oui c'est dommage, car pour un mois y a MONTH(mydate).
Par contre c'est pas comme ca que STR_TO_DATE fonctionne^^, je vous conseille d'aller lire la doc MySQL 5.x
Ca aurait été mieux de définir sous forme 'yyyy-mm-xx' mais si ca été fait sous la forme 'yyyy-mm' avec un varchar(7) normalement la requete suivante devrait fonctionner normalement avec une version de MySQL >=5.0.x

SELECT *
FROM `mytable`
WHERE mydate
BETWEEN '2010-04'
AND '2010-05'
 

les dates 2010-04 et 2010-05 seront inclues dans les résults
Si les conditions que j'ai citées au dessus sont remplies alors la requête doit fonctionner. Si ce n'est pas le cas, le problème doit venir de votre code PHP (faites par exemple un eval() sur $_COOKIE['yearToWork'].'-'.$exerciceStartMonth pour voir ce que ca donne), et comme ont dit mes camarades, j'inverserais aussi les quotes^^.

Dernière modification par Jc (03-05-2010 00:59:58)


POO PHP+Ajax en MVC avec PDO et Bases de données épaisses  : What else?

Hors ligne

#18 03-05-2010 15:31:19

Alnoss
Modérateur absent
Lieu : 06 - PACA
Inscription : 11-05-2009
Messages : 541
Site Web

Re : Selectionner les enregistrement SQL situé entre 2009-10 et 2010-09

J'ai pas mal bosser avec des bases de récup sur lequel je devais agir sur la valeur avant de pouvoir l'utiliser donc au pire, pourquoi ne pas rechercher la valeur de date() correspondant à celle stockée dans la base ?? Ainsi, les opérations et ordonnancements seront à nouveau possible...

OUI, méthode de barbare, mais bon, moi j'dis ça, j'dis rien !! big_smile


MERCI de lire le mode d'emploi avant de poster !!

Hors ligne

#19 03-05-2010 18:26:52

rick's
Membre
Inscription : 26-04-2010
Messages : 14

Re : Selectionner les enregistrement SQL situé entre 2009-10 et 2010-09

Eh bé comme ça, ça fonctionne... Allez comprendre...

$periodStart=$_COOKIE['yearToWork']."-".$exerciceStartMonth;
$periodEnd=$exerciceNextYear."-".$exerciceEndMonth;

$sqlReports="SELECT * FROM reports WHERE period BETWEEN '".$periodStart."' AND '".$periodEnd."' ORDER BY period";
$reqReports = mysql_query($sqlReports) or die("Erreur SQL : ".mysql_error()."<br>Requête : ".$sqlReports);
while ($rowReports = mysql_fetch_array($reqReports)) {
   //...
}

Hors ligne

#20 03-05-2010 18:50:48

Pierrot
Ancien nouveau
Inscription : 08-05-2009
Messages : 1 195

Re : Selectionner les enregistrement SQL situé entre 2009-10 et 2010-09

C'est vrai que ce n'est pas normal que cela fonctionne quand tu met la bonne syntaxe wink
ce doit être un miracle wink
pense a faire une prière ce soir wink

>>le concepteur c'est moi tongue et on peut pas me viré je suis mon propre patron tongue
pour info, ton client peux te mettre a la porte wink


a++

Hors ligne

#21 03-05-2010 20:01:42

Jc
Membre
Lieu : Zillisheim - Alsace
Inscription : 15-04-2010
Messages : 1 629
Site Web

Re : Selectionner les enregistrement SQL situé entre 2009-10 et 2010-09

C'etait donc bien un problème de quotes

BETWEEN "'.$_COOKIE['yearToWork'].'-'

le soucis venait de votre ' devant yearToWork. Si vous aviez mis des guillemets " pour ouvrir et fermer ta chaîne vous n'auriez pas eu ce problème ou alors fallait utiliser { } pour protéger la valeur (voir autres post récents sur ce problème.


POO PHP+Ajax en MVC avec PDO et Bases de données épaisses  : What else?

Hors ligne

Pied de page des forums