Query SQL selezionando tra due date
Domanda
Voglio selezionare i record tra due date: una data start ed enddate (sono formato data/ora in SQL). Ho la seguente query SQL ma non funziona, qualcuno potrebbe dirmi cosa sto facendo di sbagliato?
"SELECT *
FROM house
WHERE startDate >= '2012/02/22 00:00:00' AND endDate <= '2012-02-25 00:00:00'"
Soluzione
Suggerirei di convertire le date in un datatime e confrontarle, oltre a mantenere la data standard e coerente. Qualcosa di simile a:
"SELECT *
FROM house
WHERE DATE(startDate) >= DATE('2012-02-22 00:00:00')
AND DATE(endDate) <= DATE('2012-02-25 00:00:00')"
Nota: ho pensato che la tua data start e la data enddate fossero dello stesso formato delle stringhe fornite.
Altri suggerimenti
Vuoi tutte le righe startDate
è '2012-02-22'
o più tardi e endDate
è '2012-02-22'
o precedente? Quindi, usa questo:
SELECT *
FROM house
WHERE startDate >= '2012-02-22'
AND endDate < '2012-02-26' --- notice the `<`, not `<=`
--- and the `day+1`
Quando si utilizzano date con prodotti SQL, utilizzare meglio questo formato in query e dichiarazioni: '20120222'
o questo (che trovo più facile da leggere: '2012-02-22'
.
Usando le barre come '2012/02/22'
o qualsiasi altro ordine di Year-Month-Day
non è raccomandato.
Non è necessario includere la parte temporale. '2012-02-22 00:00:00'
equivale a '2012-02-22'
.
Usando endDate <= '2012-02-25 00:00:00'
significa che qualsiasi riga con data 25 febbraio 2012 ma tempo dopo mezzanotte ('00:00:00'
) non corrisponderà alla condizione. Se vuoi anche quelle file, usa endDate < '2012-02-26'
invece.
Potresti usare DATE(endDate) <= DATE('2012-02-25 00:00:00')
o DATE(endDate) <= '2012-02-25'
Ma queste condizioni sono "non paragabili", quindi le tue domande non saranno in grado di utilizzare un indice su endDate
.
C'è il costruito STR_TO_DATE
funzione in mysql che prende la stessa maschera di formato di formato data.
start_date >= str_to_date('2012/02/22 00:00:00','%Y/%m/%d %h:%i:%s)