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'
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.
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.
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.
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';