Requête postgresql entre les plages de dates

J’essaie d’interroger ma firebase database postgresql pour renvoyer des résultats lorsqu’une date est dans un mois et une année donnés. En d’autres termes, je voudrais toutes les valeurs pour un mois-année.

La seule façon dont j’ai été capable de le faire jusqu’à présent est la suivante:

SELECT user_id FROM user_logs WHERE login_date BETWEEN '2014-02-01' AND '2014-02-28' 

Le problème est que je dois calculer la première date et la dernière date avant d’interroger la table. Y a-t-il un moyen plus simple de le faire?

Merci

Avec les dates (et les heures), beaucoup de choses deviennent plus simples si vous utilisez >= start AND < end .

Par exemple:

 SELECT user_id FROM user_logs WHERE login_date >= '2014-02-01' AND login_date < '2014-03-01' 

Dans ce cas, vous devez toujours calculer la date de début du mois dont vous avez besoin, mais cela doit être simple et direct.

La date de fin est également simplifiée. ajoutez juste exactement un mois. Pas de problème avec les 28, 30, 31, etc.

Cette structure présente également l'avantage de pouvoir conserver l'utilisation des index.

Beaucoup de gens peuvent suggérer un formulaire tel que le suivant, mais ils n’utilisent pas d’ index:

 WHERE DATEPART('year', login_date) = 2014 AND DATEPART('month', login_date) = 2 

Cela implique de calculer les conditions pour chaque ligne de la table (une parsing) et de ne pas utiliser d'index pour rechercher la plage de lignes qui correspond (une recherche de plage).

De PostreSQL 9.2 Les types de plage sont pris en charge. Vous pouvez donc écrire ceci comme:

 SELECT user_id FROM user_logs WHERE '[2014-02-01, 2014-03-01]'::daterange @> login_date 

cela devrait être plus efficace que la comparaison de chaînes

Juste au cas où quelqu’un atterrirait ici … depuis 8.1 vous pouvez simplement utiliser:

 SELECT user_id FROM user_logs WHERE login_date BETWEEN SYMMETRIC '2014-02-01' AND '2014-02-28' 

De la documentation:

ENTRE SYMETRIC est le même que BETWEEN sauf que l’argument à gauche de AND n’est pas obligatoire ou inférieur à l’argument de droite. Si ce n’est pas le cas, ces deux arguments sont automatiquement échangés, de sorte qu’une plage non vide est toujours implicite.

Lisez la documentation.

http://www.postgresql.org/docs/9.1/static/functions-datetime.html

J’ai utilisé une requête comme celle-ci:

 WHERE ( date_trunc('day',table1.date_eval) = '2015-02-09' ) 

ou

 WHERE(date_trunc('day',table1.date_eval) >='2015-02-09'AND date_trunc('day',table1.date_eval) < '2015-02-09') 

Juanitos Ingenier.