Requete sql : comparaison chaine [RESOLU] - SQL/NoSQL - Programmation
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.
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 ?
Marsh Posté le 18-02-2011 à 12:05:46
Inject a écrit : Je bosse sous oracle/php/mysql. |
Sous oracle, tu peux faire ça pour convertir la chaine de caractères '01/01/1990' en la date en question :
Code :
|
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.
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 ><
Marsh Posté le 18-02-2011 à 12:12:14
euh apache c'est pas une base de données...
mysql, j'imagine?
http://dev.mysql.com/doc/refman/5. [...] tions.html
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 =)
Marsh Posté le 18-02-2011 à 12:13:39
cf le lien que je t'ai donné - str_to_date.
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
Enfin je vais fouiller de ce coté là je te remercie pour ton aide... faut que j'arrive à voir où cloche exactement la comparaison ><
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?
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 =)
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 :
|
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 !
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.
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)
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...
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 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 :
|
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 ?
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.
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???
Marsh Posté le 18-02-2011 à 15:43:23
Le format est bien jjmmaa...
je dois donc mettre %d%m%Y ?
Marsh Posté le 18-02-2011 à 15:46:01
Lis la doc, là. On t'a déjà bien mâché le travail.
Marsh Posté le 18-02-2011 à 15:55:33
Je vous remercie ça marche ! Je marque le sujet comme résolu =)
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é
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...
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 !
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 Je vous en serait très reconnaissant, merci !
Message édité par Inject le 18-02-2011 à 15:55:56