PostgreSQL: sélectionner des données avec un champ similaire sur timestamp

j'essaie de sélectionner des données à partir d'une table, en utilisant un champ "like" on date "date_checked" (timestamp). Mais j'ai cette erreur :

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

Ma demande :

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'
25
demandé sur MPelletier 2011-01-26 01:31:42

4 réponses

c'est très bien de ne pas "vouloir utiliser" < et > avec des horodateurs, mais ces opérateurs peuvent être convertis en scans index, et une correspondance string... eh bien, c'est possible, mais EWWWW.

Eh bien, l'erreur se produit parce que vous avez besoin de convertir explicitement l'horodatage en une chaîne avant d'utiliser une opération de chaîne sur elle, par exemple:

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

I supposons que vous pouvez alors créer un index sur (date_checker::text) et cette expression deviendrait un scan index mais.... EWWWW.

63
répondu araqnid 2011-01-25 22:46:47

peut-être le date_trunc la fonction est plus à votre goût:

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

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

8
répondu Peter Eisentraut 2011-01-25 22:54:50

Si vous avez besoin de faire une comparaison sur une partie d'un timestamp, il est de loin préférable d'utiliser le EXTRACT() fonction. 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 en la documentation.

4
répondu Scott Marlowe 2015-06-20 01:01:09

je ne peux pas croire que vous pouvez faire un like sur une colonne date sans la convertir en une représentation string en premier.

Vous pouvez utiliser la requête 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
répondu Patrick 2011-01-25 22:46:47