2012-10-01 13 views
49

Sto tentando di eseguire un'istruzione select mysql in cui viene visualizzata la data odierna e restituisce solo i risultati registrati in quel giorno corrente. Al momento ho provato quanto segue, ma non sembra funzionare.MySQL Select Date uguale a Today

SELECT users.id, DATE_FORMAT(users.signup_date, '%Y-%m-%d') 
    FROM users 
    WHERE users.signup_date = CURDATE() 

Ho modificato il mio SELECT dichiarazione a questo, grazie ragazzi.

SELECT id FROM users WHERE DATE(signup_date) = CURDATE()

+0

sembra che 'signup_date' è un campo datetime – Serjio

+0

@Serjio Sì, attualmente è un campo datetime. – Jako

+0

qual è il tipo di dati 'signup_date' se contiene il tempo, allora si vuole utilizzare la date_format nel' WHERE' clausola striscia il tempo per abbinare il 'CURDATE()' – Taryn

risposta

111
SELECT users.id, DATE_FORMAT(users.signup_date, '%Y-%m-%d') 
FROM users 
WHERE DATE(signup_date) = CURDATE() 
+0

è necessario utilizzare DATE() anche se il campo è di tipo Date? – rashidnk

+1

@rashidnk No. Sebbene non abbia detto chiaramente nella domanda, il campo apparentemente è di tipo 'DATETIME'. – Barmar

+1

Sebbene questa soluzione sia assolutamente corretta, non è in grado di scalare correttamente (non è possibile utilizzare un indice su 'signup_date', anche se tale indice esiste). Preferisci [soluzione di Serjio] (http://stackoverflow.com/a/12677822/1446005). – RandomSeed

9

Suona come è necessario aggiungere la formattazione al WHERE:

SELECT users.id, DATE_FORMAT(users.signup_date, '%Y-%m-%d') 
FROM users 
WHERE DATE_FORMAT(users.signup_date, '%Y-%m-%d') = CURDATE() 

Vedi SQL Fiddle with Demo

+5

saluta la tua esibizione. Questa query non utilizza mai l'indice – Serjio

12

Questa query utilizzerà indice se lo avete per signup_date campo

SELECT users.id, DATE_FORMAT(users.signup_date, '%Y-%m-%d') 
    FROM users 
    WHERE signup_date >= CURDATE() && signup_date < (CURDATE() + INTERVAL 1 DAY) 
+0

I downvotes a questa risposta sono assurdi. Questo è in effetti l'approccio preferenziale, perché questa query sarebbe in grado di sfruttare un indice su "signup_date", a differenza di altri approcci. – RandomSeed

+0

@RandomSeed L'idea generale di testare per 'signup_date' tra due volte è corretta, ma i tempi non lo sono. Dovrebbe essere tra '00: 00' e' 23: 59: 59' nella data corrente. – Barmar

+1

@Barmar Sì hai ragione. Ho risolto la risposta. – RandomSeed