2011-05-03 15 views

Respuesta

40

creo que desea emitir su dt a un date y fijar the format of your date literal:

SELECT * 
FROM table 
WHERE dt::date = '2011-01-01' -- This should be ISO-8601 format, YYYY-MM-DD 

O el standard version:

SELECT * 
FROM table 
WHERE CAST(dt AS DATE) = '2011-01-01' -- This should be ISO-8601 format, YYYY-MM-DD 

El extract function no entiende "fecha" y se devuelve una número.

+6

Una adición: si el campo de marca de tiempo está indexado, usar dt :: date o CAST (dt AS date) impide que se use el índice. Un método alternativo sería construir un índice funcional en dt :: date o escribirlo de esta manera (utilizando el parámetro $ 1 como una cadena de fecha): WHERE dt> = $ 1 AND dt <$ 1 + interval '1 day'. –

1

Con PostgreSQL hay una serie de funciones de fecha/hora disponibles, consulte here.

En su ejemplo, se puede utilizar:

SELECT * FROM myTable WHERE date_trunc('day', dt) = 'YYYY-MM-DD'; 

Si está ejecutando esta consulta regularmente, es posible crear un índice mediante la función date_trunc así:

CREATE INDEX date_trunc_dt_idx ON myTable (date_trunc('day', dt)); 

Una de las ventajas de esto es que hay más flexibilidad con los husos horarios si es necesario, por ejemplo:

CREATE INDEX date_trunc_dt_idx ON myTable (date_trunc('day', dt at time zone 'Australia/Sydney')); 
SELECT * FROM myTable WHERE date_trunc('day', dt at time zone 'Australia/Sydney') = 'YYYY-MM-DD';