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