J'essaie d'interroger ma base de données postgresql pour renvoyer des résultats où une date est dans un certain mois et une année. En d'autres termes, je voudrais toutes les valeurs pour un mois-année.
La seule façon dont j'ai pu le faire jusqu'à présent est comme ceci:
SELECT user_id
FROM user_logs
WHERE login_date BETWEEN '2014-02-01' AND '2014-02-28'
Le problème avec ceci est que je dois calculer la première date et la dernière date avant d'interroger la table. Existe-t-il un moyen plus simple de procéder?
Merci
sql
postgresql
date
between
John
la source
la source
Réponses:
Avec les dates (et les heures), beaucoup de choses deviennent plus simples si vous utilisez
>= start AND < end
.Par exemple:
Dans ce cas, vous devez toujours calculer la date de début du mois dont vous avez besoin, mais cela devrait être simple de plusieurs manières.
La date de fin est également simplifiée; il suffit d'ajouter exactement un mois. Pas de soucis avec les 28e, 30e, 31e, etc.
Cette structure présente également l'avantage de pouvoir maintenir l'utilisation d'index.
De nombreuses personnes peuvent suggérer un formulaire tel que celui-ci, mais n'utilisent pas d' index:
Cela implique de calculer les conditions pour chaque ligne de la table (une analyse) et de ne pas utiliser d'index pour trouver la plage de lignes qui correspondra (une recherche par plage).
la source
2014-12-01
&2015-01-01
. Le second peut être indexé aussi, mais ce n'est pas anodin, je l'admets -EXTRACT()
semble plus compatible.Depuis PostreSQL 9.2 , les types de plage sont pris en charge. Vous pouvez donc écrire ceci comme:
cela devrait être plus efficace que la comparaison de chaînes
la source
Juste au cas où quelqu'un atterrirait ici ... depuis 8.1, vous pouvez simplement utiliser:
À partir de la documentation:
la source
Entre le mot-clé fonctionne exceptionnellement pour une date. il suppose que l'heure est à 00:00:00 (c'est-à-dire minuit) pour les dates.
la source
Lisez la documentation.
http://www.postgresql.org/docs/9.1/static/functions-datetime.html
J'ai utilisé une requête comme celle-ci:
ou
Juanitos Ingenier.
la source