[RESOLU]Requete sql : comparaison chaine

Requete sql : comparaison chaine [RESOLU] - SQL/NoSQL - Programmation

Marsh Posté le 18-02-2011 à 11:55:18    

Bonjour à tous.  :)  
Alors voila, j'ai un soucis avec une comparaison de chaine...
 
En fait je dois comparer des dates qui sont au format chaines dans la base de donnée sous forme jjmmaa. Disons que ce champ s'apelle date1
Moi on me donne une date du style "2007" et avec ça je dois récupérer toutes les personnes  dont date1 est compris entre le 1er septembre 2008 et le 31 aout 2009.
 
Et là je suis en train de m'arracher les cheveux sur ce truc qui doit pourtant être con... Enfin je l'espère.
 
Ma requête ressemble plus ou moins à ça pour le moment mais j'ai tout essayé et rien ne marche !  :pt1cable:  
 
SELECT * FROM `personne` where  date1 LIKE "__[09-12]07" or date1 LIKE "__[01-08]08"  ;
 
Je ne peux pas convertir le champs en date c'est dans le cadre d'un stage et je ne peux pas toucher à la structure de la BDD donc bon... J'essaye de faire avec. Bien évidemment la date 2008 est en fait uen variable mais ça ce n'est pas un problème, juste si quelqu'un pouvait m'aider pour cette foutu requête  :o  Je vous en serait très reconnaissant, merci !


Message édité par Inject le 18-02-2011 à 15:55:56
Reply

Marsh Posté le 18-02-2011 à 11:55:18   

Reply

Marsh Posté le 18-02-2011 à 12:01:03    

Convertis-les à la volée dans ta requête pour simplifier la comparaison...
Quel sgbd? Par exemple sous oracle tu as to_date() pour faire ça.


---------------
Can't buy what I want because it's free -
Reply

Marsh Posté le 18-02-2011 à 12:03:34    

Je bosse sous oracle/php/mysql.
Les convertir à la volée c'est à dire ?  Récupérer tout sans distinction et ensuite faire mes comparaisons et mon tri ?  Il n'y a aucun moyen de faire ça directement dans la requête ?

Reply

Marsh Posté le 18-02-2011 à 12:05:46    

Inject a écrit :

Je bosse sous oracle/php/mysql.
Les convertir à la volée c'est à dire ?  Récupérer tout sans distinction et ensuite faire mes comparaisons et mon tri ?  Il n'y a aucun moyen de faire ça directement dans la requête ?


 
Sous oracle, tu peux faire ça pour convertir la chaine de caractères '01/01/1990' en la date en question :

Code :
  1. SELECT to_date('01/01/1990', 'DD/MM/YYYY') FROM dual;


 
Tu dois pouvoir adapter ta requête pour utiliser ce genre de fonctions et ainsi comparer des dates plutôt que des chaines de caractères.


---------------
Can't buy what I want because it's free -
Reply

Marsh Posté le 18-02-2011 à 12:11:34    

Mh après essai j'ai l'erreur comme quoi la fonction n'existe pas...  
En effet erreur de ma part j'bosse sous Oracle chez moi mais ici je suis sous Apache, suis-je bête ><

Reply

Marsh Posté le 18-02-2011 à 12:12:14    

euh apache c'est pas une base de données...[:pingouino]
mysql, j'imagine?
http://dev.mysql.com/doc/refman/5. [...] tions.html


Message édité par skeye le 18-02-2011 à 12:12:44

---------------
Can't buy what I want because it's free -
Reply

Marsh Posté le 18-02-2011 à 12:12:56    

Oui c'est ça *a du mal ce midi*
je teste ça et je te tiens au courant, merci =)


Message édité par Inject le 18-02-2011 à 12:13:43
Reply

Marsh Posté le 18-02-2011 à 12:13:39    

cf le lien que je t'ai donné - str_to_date.


Message édité par skeye le 18-02-2011 à 12:13:44

---------------
Can't buy what I want because it's free -
Reply

Marsh Posté le 18-02-2011 à 12:21:52    

Donc en gros maintenant ma requête en version simplifiée ressemble à un truc comme ça :  
 
SELECT * FROM `personne` where  STR_TO_DATE('date1', GET_FORMAT(DATE, 'EUR')) < "31.08.09"
 
Sauf qu'elle ne me renvoi aucun enregistrement ce qui n'est pas normal  :pt1cable:  
Enfin je vais fouiller de ce coté là je te remercie pour ton aide... faut que j'arrive à voir où cloche exactement la comparaison ><

Reply

Marsh Posté le 18-02-2011 à 12:55:54    

à la place de "31.08.09", tu devrais pas plutôt mettre "31.08.2009" vue que STR_TO_DATE convertit en date et get_format(..., 'EUR') utilise %Y pour l'année, représentée sur 4 chiffres?


---------------
Astres, outil de help-desk GPL : http://sourceforge.net/projects/astres, ICARE, gestion de conf : http://sourceforge.net/projects/icare, Outil Planeta Calandreta : https://framalibre.org/content/planeta-calandreta
Reply

Marsh Posté le 18-02-2011 à 12:55:54   

Reply

Marsh Posté le 18-02-2011 à 13:12:13    

En effet je n'avais pas fait attention à ce détail mais même après modification il me renvoi toujours un réponse vide... je suis partie sur un autre problème histoire de laisser un peu celui là de coté le temps que ça refroidisse mais si vous avez des pistes je ne dis pas non =)

Reply

Marsh Posté le 18-02-2011 à 15:28:50    

Bon je reviens vers vous parce que je n'arrive décidément pas à trouver de solutions à cette chose et je suis en train de m'arracher les cheveux dessus ! J'aimerais pouvoir trouve rune solution avant le week-end, quelqu'un aurait une idée ?  

Code :
  1. SELECT * FROM `personne` where  STR_TO_DATE('date1', GET_FORMAT(DATE, 'EUR')) < "31.08.2009"


 
Cette requête refuse de marcher... Je vous met quelques exemples que j'ai comme valeur de champs dan sma base de données pour vous donner un aperçu :  
 
 
211209 , 011009 , 020508 , 020511 , 020310.... etc
 
Donc elle est bien censée m'afficher quelque chose mais nada ! :??:


Message édité par Inject le 18-02-2011 à 16:00:57
Reply

Marsh Posté le 18-02-2011 à 15:31:53    

Les guillemets en sql ça existe pas, chez moi. Et au mieux ça délimiterait une chaine, pas une date.:o


---------------
Can't buy what I want because it's free -
Reply

Marsh Posté le 18-02-2011 à 15:34:33    

Au niveau de la date à la fin ? Le truc c'est que si je ne les met pas j'ai une magnifique erreur sql ... Comme quoi j'ai une erreur de syntaxe près de .2009
Et chose étrange à la place de m'afficher la requête (qui s'affiche normalement en cas d'erreur), il ne m'affiche que "s" ...  
 
Alors que quand je met les guillements ça marche nicquel (à part les enregistrements inexistants bien sûr)

Reply

Marsh Posté le 18-02-2011 à 15:37:22    

skeye a écrit :

Les guillemets en sql ça existe pas, chez moi. Et au mieux ça délimiterait une chaine, pas une date.:o


 
sous mysql, faut mettre les dates entre quotes pour que ça marche...  :o


---------------
Astres, outil de help-desk GPL : http://sourceforge.net/projects/astres, ICARE, gestion de conf : http://sourceforge.net/projects/icare, Outil Planeta Calandreta : https://framalibre.org/content/planeta-calandreta
Reply

Marsh Posté le 18-02-2011 à 15:40:06    

Inject a écrit :

Au niveau de la date à la fin ? Le truc c'est que si je ne les met pas j'ai une magnifique erreur sql ... Comme quoi j'ai une erreur de syntaxe près de .2009
Et chose étrange à la place de m'afficher la requête (qui s'affiche normalement en cas d'erreur), il ne m'affiche que "s" ...

 

Alors que quand je met les guillements ça marche nicquel (à part les enregistrements inexistants bien sûr)

 

Déjà tu formates en format EUR, alors que d'après la doc, c'est du '%d.%m.%Y', et que tu as du '%d-%m-%Y'...et une chaine en sqkl c'est délimité par des simple quotes.

 
Code :
  1. SELECT * FROM `personne` WHERE  STR_TO_DATE(date1, '%d-%m-%Y') < str_to_date('31.08.2009', '%d.%m.%Y')


Message édité par skeye le 18-02-2011 à 15:40:36

---------------
Can't buy what I want because it's free -
Reply

Marsh Posté le 18-02-2011 à 15:40:50    

J'ai peut-être eu un problème de compréhension avec la fonctions STR_TO_DATE c'est fort possible... mettre le champ 'date1' comme marche-t-il vraiment ? Sachant que le format du camp est jjmmaa ?

Reply

Marsh Posté le 18-02-2011 à 15:41:14    

...et d'ailleurs tu passes la chaine 'date1' à str_to_date dans ta requête...ça risque pas de marcher.


---------------
Can't buy what I want because it's free -
Reply

Marsh Posté le 18-02-2011 à 15:42:09    

Inject a écrit :

J'ai peut-être eu un problème de compréhension avec la fonctions STR_TO_DATE c'est fort possible... mettre le champ 'date1' comme marche-t-il vraiment ? Sachant que le format du camp est jjmmaa ?


ça marche à condition d'adapter au format! c'est jj-mm-aaaa ou jjmmaa, au final???


---------------
Can't buy what I want because it's free -
Reply

Marsh Posté le 18-02-2011 à 15:43:23    

Le format est bien jjmmaa...
je dois donc mettre %d%m%Y ?

Reply

Marsh Posté le 18-02-2011 à 15:46:01    

Lis la doc, là. On t'a déjà bien mâché le travail.


---------------
Can't buy what I want because it's free -
Reply

Marsh Posté le 18-02-2011 à 15:55:33    

Je vous remercie ça marche ! Je marque le sujet comme résolu =)

Reply

Marsh Posté le 18-02-2011 à 20:49:55    

ca va marcher un temps, si tu commences à avoir beaucoup de lignes dans ta table, bonjour les problèmes de performance à cause d'un balayage complet de table....
 
Le mieux est de refaire la colonne avec un type date, et de l'indexer
Au pire sous Oracle tu fais un index calculé

Reply

Marsh Posté le 19-02-2011 à 08:51:10    

Comme je le disais dans mon premier poste je ne peux pas toucher à la structure de la table et je dois travailler sur quelque chose de pré-existant en me débrouillant pour ce genre de problèmes...
Après ça ne relève plus de mon autorité je leur avait demandé s'il était possible de convertir tous les champs date qui sont pour le moment en string en vrai champs date mais ils ont refusés...

Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

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