Con le date (e gli orari) molte cose diventano più semplici se usi >= start AND < end
.
Ad esempio:
SELECT
user_id
FROM
user_logs
WHERE
login_date >= '2014-02-01'
AND login_date < '2014-03-01'
In questo caso devi ancora calcolare la data di inizio del mese di cui hai bisogno, ma dovrebbe essere semplice in molti modi.
Anche la data di fine è semplificata; basta aggiungere esattamente un mese. Nessun problema con il 28, 30, 31, ecc.
Questa struttura ha anche il vantaggio di poter mantenere l'uso degli indici.
Molte persone possono suggerire un modulo come il seguente, ma non usa gli indici:
WHERE
DATEPART('year', login_date) = 2014
AND DATEPART('month', login_date) = 2
Ciò comporta il calcolo delle condizioni per ogni singola riga della tabella (una scansione) e non l'utilizzo di index per trovare l'intervallo di righe che corrisponderanno (una ricerca di intervallo).