2011-01-25 11 views
23

Estoy intentando seleccionar datos de una tabla, usando un campo de fecha "me gusta" en la fecha "date_checked" (timestamp). Pero tengo este error:PostgreSQL: Seleccione datos con un me gusta en el campo de marca de tiempo

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

Mi petición es:

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

que no quieren usar:

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' 

Respuesta

59

Es todo muy bien en no "querer utilizar" < y> con marcas de tiempo, pero esos operadores se pueden convertir en escaneos de índice, y un emparejamiento de cadenas ... bueno, puede, pero EWWWW.

Pues bien, el error se produce porque es necesario para convertir explícitamente la marca de tiempo en una cadena antes de usar una operación de cadena en ella, por ejemplo:

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

y yo supongamos, a continuación, puede crear un índice en (date_checker::text) y esa expresión se convertiría en un escaneo de índice pero .... EWWWW.

+5

+1 para desalentar el uso de una solución de este tipo –

+3

Creo que si los escaneos de índice son su principal preocupación, es probable que tenga un mejor cambio con el enfoque 'LIKE'. Las estimaciones de selectividad de las desigualdades pueden caer rápidamente. Simplemente diciendo ... ;-) –

+6

+1 para "EWWWWWW" :) –

2

No creo que pueda hacer un like en una columna de fecha sin convertirlo primero en una representación de cadena.

Usted puede utilizar el entre de consulta para seleccionar entre dos fechas, por ejemplo:

SELECT id FROM my_table WHERE date_checker BETWEEN '2011-01-01' AND '2011-02-01'; 
+0

Es posible hacer un me gusta en una columna de fecha –

+0

@KevinCampion: No, no lo es. No sin convertirlo primero. – Patrick

8

Tal vez la función date_trunc sería más a su gusto:

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

También se puede poner un índice en esa expresión, si es necesario.

4

Si necesita hacer una comparación en alguna parte de un timestamp, es mucho mejor usar la función EXTRACT(). Por ejemplo:

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

detalles de los diferentes "campos" se puede extraer a partir de una fecha están en the documentation.

+0

o date_trunc si necesita algo así como la primera x parte de una fecha. puedes convertir '2011-01-13 12:15:23' en '2011-01-01 00:00:00' –

Cuestiones relacionadas