PostgreSQL La base de donnees la plus sophistiquee au monde.

Forums PostgreSQL.fr

Le forum officiel de la communauté francophone de PostgreSQL

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

#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.

sad
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'

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.

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'

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

Hors ligne

Pied de page des forums