Estou tentando consultar meu banco de dados postgresql para retornar resultados onde uma data está em determinado mês e ano. Em outras palavras, gostaria de todos os valores para um mês-ano.
A única maneira que consegui fazer até agora é assim:
SELECT user_id
FROM user_logs
WHERE login_date BETWEEN '2014-02-01' AND '2014-02-28'
O problema com isso é que tenho que calcular a primeira data e a última data antes de consultar a tabela. Existe uma maneira mais simples de fazer isso?
obrigado
sql
postgresql
date
between
John
fonte
fonte
Respostas:
Com datas (e horas), muitas coisas ficam mais simples se você usar
>= start AND < end
.Por exemplo:
Nesse caso, você ainda precisa calcular a data de início do mês de que precisa, mas isso deve ser direto de várias maneiras.
A data de término também é simplificada; basta adicionar exatamente um mês. Não se meta com o dia 28, 30, 31, etc.
Essa estrutura também tem a vantagem de poder manter o uso de índices.
Muitas pessoas podem sugerir uma forma como a seguinte, mas não usam índices:
Isso envolve calcular as condições para cada linha na tabela (uma varredura) e não usar o índice para encontrar o intervalo de linhas que corresponderão (uma busca por intervalo).
fonte
2014-12-01
&2015-01-01
. O segundo também pode ser indexado, mas isso não é trivial, admito -EXTRACT()
parece mais compatível.Do PostreSQL 9.2 Tipos de intervalo são suportados. Então você pode escrever assim:
isto deve ser mais eficiente do que a comparação de strings
fonte
No caso de alguém pousar aqui ... desde o 8.1, você pode simplesmente usar:
Dos documentos:
fonte
Entre palavras-chave funciona excepcionalmente para uma data. ele assume que a hora é 00:00:00 (ou seja, meia-noite) para datas.
fonte
Leia a documentação.
http://www.postgresql.org/docs/9.1/static/functions-datetime.html
Usei uma consulta assim:
ou
Juanitos Ingenier.
fonte