Me he enfrentado a un escenario extraño al comparar fechas en postgresql (versión 9.2.4 en windows). Tengo una columna en mi tabla que dice update_date con el tipo 'marca de tiempo sin zona horaria'. El cliente puede buscar en este campo con solo fecha (es decir, 2013-05-03) o fecha con hora (es decir, 2013-05-03 12:20:00). Esta columna tiene el valor como marca de tiempo para todas las filas actualmente y tiene la misma parte de fecha (2013-05-03) pero diferencia en parte de tiempo.
Cuando comparo esta columna, obtengo resultados diferentes. Como los siguientes:
select * from table where update_date >= '2013-05-03' AND update_date <= '2013-05-03' -> No results
select * from table where update_date >= '2013-05-03' AND update_date < '2013-05-03' -> No results
select * from table where update_date >= '2013-05-03' AND update_date <= '2013-05-04' -> results found
select * from table where update_date >= '2013-05-03' -> results found
Mi pregunta es cómo puedo hacer posible que la primera consulta obtenga resultados, quiero decir, ¿por qué la tercera consulta está funcionando pero no la primera?
¿Puede alguien ayudarme con esto? Gracias por adelantado.
fuente
'2013-05-03'::date
y'1 day'::interval
) PostgreSQL específica?CAST('2013-05-03' AS DATE) + CAST('1 day' AS INTERVAL)
(IIRC). YMMV sobre la existencia y el comportamiento deDATE
yINTERVAL
.::DATE
agregarse a la primera parte de la cláusulaWHERE update_date::date = '2013-05-03'
funcionaría tan bien y tal vez un poco más legible?update_date
eratimestamp without timezone
. Supuse un índice en esa columna. su predicado no usaría ese índice.Cuando compara
update_date >= '2013-05-03'
postgres, arroja valores al mismo tipo para comparar valores. Entonces su '2013-05-03' fue lanzado a '2013-05-03 00:00:00'.Entonces, para update_date = '2013-05-03 14:45:00' su expresión será que:
Esto es siempre
false
Para resolver este problema, envíe update_date a
date
:fuente
update_date
de la tabla frente al valor único del parámetro de consulta es terriblemente ineficiente, y se asegura de que el servidor no pueda aprovechar los índices en esa columna. Estoy tentado a -1 esto.SELECT * FROM my_table WHERE update_date >= '2013-05-03' AND update_date < '2013-05-04';
(Tenga en cuenta el uso del 4 de mayo en lugar de tercero y con un SIGNO MENOS QUE EN vez de menos que o igual.)Usa el
range
tipo. Si el usuario ingresa una fecha:Si el usuario ingresa marcas de tiempo, entonces no necesita la
::date + 1
partehttp://www.postgresql.org/docs/9.2/static/rangetypes.html
http://www.postgresql.org/docs/9.2/static/functions-range.html
fuente
Use la conversión de fecha para comparar con la fecha: intente esto:
fuente