Vous n'êtes pas identifié(e).
- Contributions : Récentes | Sans réponse
#1 12/05/2010 17:17:48
- Dadou972
- Membre
Problème opérateur LIKE sur le type DATE et TIMESTAMP
Bonjour,
Je ne parviens pas à exécuter la requête suivante :
"SELECT * FROM manipulations WHERE date_saisie LIKE '%2010%'.
J'obtiens l'erreur suivante :
ERREUR: l'opérateur n'existe pas : date ~~ unknown
LINE 1: SELECT * FROM manipulations WHERE date_saisie LIKE '%2010%'
^
HINT: Aucun opérateur ne correspond au nom donné et aux types d'arguments.
Vous devez ajouter des conversions explicites de type.
Ma version de postgreSQL est la 8.3.8. Il s'agit de ma machine. Sur le serveur, la version est la 8.1.19 et il n'y a pas d'erreur quand j'effectue exactement la même requête.
Quelqu'un pourrait-il m'aider?:D
Merci beaucoup
Hors ligne
#2 12/05/2010 17:45:44
- gleu
- Administrateur
Re : Problème opérateur LIKE sur le type DATE et TIMESTAMP
En version 8.3, certaines conversions implicites ont été supprimées. Donc, en effet, utiliser LIKE sur autre chose que du texte a de forte chance de ne pas passer. Deux solutions :
* la mauvaise : WHERE date_saisie::text LIKE '%2010%'
* la bonne : WHERE to_char(date_saisie, 'YYYY') = '2010'
Guillaume.
Hors ligne
#3 12/05/2010 17:49:32
- Dadou972
- Membre
Re : Problème opérateur LIKE sur le type DATE et TIMESTAMP
Merci beaucoup!! Ça marche super bien. Je vais prendre la bonne méthode. Mieux vaut prévenir que guérir.
Audrey
Hors ligne
#4 12/05/2010 21:48:34
- Marc Cousin
- Membre
Re : Problème opérateur LIKE sur le type DATE et TIMESTAMP
Au passage, une remarque, qui me semble importante : WHERE to_char(date_saisie, 'YYYY') = '2010' ne pourra pas utiliser d'index s'il y en a un sur date saisie.
La forme VRAIMENT bonne, c'est where date_saisie >= '2010-01-01' and date_saisie < '2011-01-01'
C'est pour pinailler, mais si i y avait beaucoup d'enregistrements dans la table, celà pourrait faire une très grosse différence.
Marc.
Hors ligne
#5 12/05/2010 23:21:04
- gleu
- Administrateur
Re : Problème opérateur LIKE sur le type DATE et TIMESTAMP
À part que tu retombes dans le problème de conversion. Donc, il faudrait plutôt faire date_saisie::text >= '2010-01-01' and date_saisie::text < '2011-01-01'
Guillaume.
Hors ligne
#6 13/05/2010 10:58:04
- Marc Cousin
- Membre
Re : Problème opérateur LIKE sur le type DATE et TIMESTAMP
date_saisie est une date.
2010-01-01 est la date au format iso.
test=# CREATE TABLE test (date_saisie date);
CREATE TABLE
test=# SELECT * from test where date_saisie >= '2010-01-01' and date_saisie < '2011-01-01'
test-# ;
date_saisie
-------------
(0 rows)
Sinon, si on n'a pas une base avec un datestyle iso, sait on jamais, on peut écrire :
SELECT * from test where date_saisie >= to_date('2010-01-01','YYYY-MM-DD') and date_saisie < to_date('2011-01-01','YYYY-MM-DD');
Mais c'est cette forme qui est la bonne : on convertit la valeur à tester dans le type de la colonne, jamais l'inverse.
À moins que date_saisie ne soit pas une date, mais dans ce cas, ce n'est pas cohérent avec :
ERREUR: l'opérateur n'existe pas : date ~~ unknown
Marc.
Hors ligne
#7 03/06/2015 10:55:44
- lemjid
- Membre
Re : Problème opérateur LIKE sur le type DATE et TIMESTAMP
Bonjour,
Je reprend cette discussion car j'ai aussi un souci avec l'opérateur "LIKE".
Je suis en version 9.1.7 de postgresql sur redhat5. Je trouve dans la doc section 9.7.1 que l'operateud "LIKE" sans "%" se comporte comme "=" equal. alors qu'il ne me donne rien sur une recherche de chaie de 9 caractères alors que ça marche avec "%". Est ce que ceci a un rapport avec les indexes utilisés et/ou le type encodage????
Merci d'avance.
Hors ligne
#8 03/06/2015 11:45:37
- lemjid
- Membre
Re : Problème opérateur LIKE sur le type DATE et TIMESTAMP
Quelqu"un à une isée SVP?
Hors ligne
#9 03/06/2015 21:39:40
- rjuju
- Administrateur
Re : Problème opérateur LIKE sur le type DATE et TIMESTAMP
Bonjour,
Probablement des espaces en fin de chaîne, ou des caractères non visibles.
Julien.
https://rjuju.github.io/
Hors ligne
#10 04/06/2015 09:37:51
- lemjid
- Membre
Re : Problème opérateur LIKE sur le type DATE et TIMESTAMP
Bonjour,
Merci beacoup Julien! En effet (ça ressemble un peut), j'ai constaté après que la colonne en question été déclaré en char(50) ce qui contient bien évidemment plus que mes caractères recherchés.
Merci encor pour ta réactivité
Hors ligne