2012-10-30 17 views
6

Nella users tavolo ho un campo chiamato dob che memorizza la data di nascita degli utenti in questo formato:utenti SELECT * che hanno una certa età

1959-04-02 

Comunque mi desidera selezionare tutti gli utenti che hanno 18 e 19 anni. Questa è la mia domanda:

SELECT * 
FROM `users` 
WHERE dob BETWEEN '1993-10-30' AND '1994-10-30' 

Ma sembra solo per selezionare lo più 18 anni di età e alcuni (ma non tutti) di età 19 anni. Ho un sacco di utenti di test nel db e il numero di 18 e 19 anni sono uguali. Eppure questa domanda produce circa il 90% di 18 anni e circa il 10% di 19 anni. Perché?

+0

vostro campo è un campo Data right ? non una stringa? –

+0

@FrankThomas sì, è la data. – TK123

+1

fare così: SELECT * DEGLI utenti ' DOVE DOB> = '1993-10-30' AND dob <= '1994-10-30' – kidz

risposta

4

Le persone di età compresa tra 18 e 19 anni comprendono una gamma di date di nascita oltre 2 anni. La tua richiesta copre solo 1 anno. Pensa a rielaborare la tua logica.

4

Vorrei consigliare qualcosa di simile:

SELECT * 
FROM `users` 
WHERE dob BETWEEN 
    CURDATE() - INTERVAL 18 YEARS 
    AND CURDATE() - INTERVAL 20 YEARS 

Tecnicamente che includerà le persone che si rivolgono 20 di oggi. Puoi cambiare il interval in un DATE_ADD e essere più preciso se lo desideri.

Questo è un po 'più pulito, perché non è necessario rielaborare i due compleanni in PHP (o dio non voglia, manualmente) ogni volta.

+0

Mi piace l'idea di non dover calcolare le date in PHP, che è quello che stavo facendo. Ma questa query genera questo errore: '# 1064 - Hai un errore nella sintassi SQL; controlla il manuale corrispondente alla versione del tuo server MySQL per la sintassi corretta da utilizzare vicino a "ANNI E CURDATE() - INTERVALLO 20 ANNI DI LIMITE 0, 30" alla riga 4 " – TK123

+0

Potrebbe essere necessario" ANNO "(singolare) invece di 'YEARS' (plurale). Inoltre, dato che si tratta di un campo data piuttosto che di un campo data/ora (che è quello che uso di solito) non sono sicuro se hai bisogno di citazioni intorno ad esso. Io non la penso così, ma vorrei testare. –

+0

'YEAR' ha eliminato l'errore di sintassi ma ha restituito 0 righe anche se ho 18 e 19 anni nella tabella. – TK123

2

io non ho abbastanza fama di commentare, ma la risposta di David Grenier lavorerò se mettete le maggiori primo intervallo (e quest'anno non ANNI, come ha sottolineato)

SELECT * 
FROM `users` 
WHERE dob BETWEEN 
CURDATE() - INTERVAL 20 YEAR 
AND CURDATE() - INTERVAL 18 YEAR 
Problemi correlati