web-dev-qa-db-fra.com

PostgreSQL: sélectionner des données avec un champ d'horodatage similaire

J'essaye de sélectionner des données d'une table, en utilisant un "comme" sur le champ de date "date_checked" (horodatage). Mais j'ai cette erreur:

SQLSTATE[42883]: Undefined function: 7 ERROR:  operator does not exist: timestamp without time zone

Ma demande est:

SELECT my_table.id
FROM my_table
WHERE my_table.date_checker LIKE '2011-01-%'

Je ne veux pas utiliser:

SELECT my_table.id
FROM my_table
WHERE my_table.date_checker >= '2011-01-01 00:00:00' 
    AND  my_table.date_checker < '2011-02-01 00:00:00'
28
Kevin Campion

C'est très bien de ne pas "vouloir utiliser" <et> avec des horodatages, mais ces opérateurs peuvent être convertis en analyses d'index, et une correspondance de chaîne ... enfin, c'est possible, mais EWWWW.

Eh bien, l'erreur se produit car vous devez convertir explicitement l'horodatage en chaîne avant d'utiliser une opération de chaîne dessus, par exemple:

date_checker::text LIKE '2011-01-%'

et je supposez vous pourriez alors créer un index sur (date_checker::text) et cette expression deviendrait un scan d'index mais .... EWWWW.

73
araqnid

Peut-être le date_trunc fonction serait plus à votre goût:

... WHERE date_trunc('month', my_table.date_checker) = '2011-01-01'

Vous pouvez également mettre un index sur cette expression, si nécessaire.

8
Peter Eisentraut

Si vous devez faire une comparaison sur une partie d'une timestamp, il est préférable d'utiliser la fonction EXTRACT() . Par exemple:

WHERE EXTRACT(YEAR FROM date_checker) = 2011
AND EXTRACT(MONTH FROM date_checker) = 1

Les détails des différents "champs" que vous pouvez extraire d'une date sont dans la documentation .

4
Scott Marlowe

Je ne crois pas que vous puissiez faire un like sur une colonne de date sans la convertir d'abord en une représentation sous forme de chaîne.

Vous pouvez utiliser la requête entre pour sélectionner entre deux dates, par exemple:

SELECT id FROM my_table WHERE date_checker BETWEEN '2011-01-01' AND '2011-02-01';
2
Patrick