Estoy tratando de consultar mi base de datos postgresql para devolver resultados donde una fecha está en cierto mes y año. En otras palabras, me gustaría todos los valores para un mes-año.
La única forma en que he podido hacerlo hasta ahora es así:
SELECT user_id
FROM user_logs
WHERE login_date BETWEEN '2014-02-01' AND '2014-02-28'
El problema con esto es que tengo que calcular la primera fecha y la última fecha antes de consultar la tabla. ¿Existe una forma más sencilla de hacer esto?
Gracias
sql
postgresql
date
between
Juan
fuente
fuente
Respuestas:
Con fechas (y horas) muchas cosas se vuelven más simples si usa
>= start AND < end
.Por ejemplo:
En este caso, aún necesita calcular la fecha de inicio del mes que necesita, pero eso debería ser sencillo de varias maneras.
La fecha de finalización también se simplifica; solo agregue exactamente un mes. No jugar con el 28, 30, 31, etc.
Esta estructura también tiene la ventaja de poder mantener el uso de índices.
Muchas personas pueden sugerir un formulario como el siguiente, pero no utilizan índices:
Esto implica calcular las condiciones para cada fila de la tabla (un escaneo) y no usar el índice para encontrar el rango de filas que coincidirán (una búsqueda de rango).
fuente
2014-12-01
&2015-01-01
. El segundo también se puede indexar, pero eso no es trivial, lo admito,EXTRACT()
parece más compatible.Desde PostreSQL 9.2 , se admiten los tipos de rango . Entonces puedes escribir esto como:
esto debería ser más eficiente que la comparación de cadenas
fuente
En caso de que alguien aterrice aquí ... desde 8.1, simplemente puede usar:
De los documentos:
fuente
Entre palabra clave funciona excepcionalmente para una cita. asume que la hora es a las 00:00:00 (es decir, medianoche) para las fechas.
fuente
Lea la documentación.
http://www.postgresql.org/docs/9.1/static/functions-datetime.html
Usé una consulta como esa:
o
Ingeniero Juanitos.
fuente