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 devrait être simple à bien des égards.
La date de fin est également simplifiée; il suffit d'ajouter exactement un mois. Ne plaisante pas avec le 28, le 30, le 31, etc.
Cette structure présente également l'avantage de pouvoir conserver l'utilisation des index.
De nombreuses personnes peuvent suggérer un formulaire tel que celui-ci, mais elles ne le font pas utiliser les 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 (un balayage) et de ne pas utiliser d'index pour trouver la plage de lignes qui correspondra (une recherche de plage).