MySQL seleziona data uguale a oggi


96

Sto cercando di eseguire un'istruzione di selezione mysql in cui guarda la data odierna e restituisce solo i risultati che si sono registrati in quel giorno corrente. Al momento ho provato quanto segue, ma non sembra funzionare.

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

Ho modificato la mia SELECTdichiarazione in questo, grazie ragazzi.

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


sembra che signup_datesia il campo datetime
Sergii Stotskyi

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

qual è il tipo di dati signup_datese contiene l'ora, allora ti consigliamo di utilizzare date_format nella WHEREclausola per rimuovere l'ora in modo che corrisponda aCURDATE()
Taryn

@bluefeet grazie, ho modificato il mio script. Sembra funzionare, ma quando non ci sono risultati. mysql_num_rowsnon visualizza 0. Solo uno spazio vuoto.
Jako

Risposte:


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

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

2
@rashidnk No. Anche se non ha detto chiaramente nella domanda, il campo è apparentemente di tipo DATETIME.
Barmar

2
Sebbene questa soluzione sia assolutamente corretta, non viene ridimensionata correttamente (non è possibile utilizzare un indice su signup_date, anche se tale indice esiste). Preferisci la soluzione di Serjio .
RandomSeed

o se per trovare in una data particolare, utilizzando anche l'indice `` SELECT users.id, DATE_FORMAT (users.signup_date, '% Y-% m-% d') FROM users where signup_date> = '2017-08 -30 00:00:00 "e signup_date <=" 2017-08-30 23:59:59 "; ``
Sumit M Asok

3
@SumitMAsok Meglio da usare < '2017-08-31 00:00:00'nel caso tu stia usando una versione di MySQL con millisecondi.
Barmar

29

Questa query utilizzerà index se lo hai per signup_datefield

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

I voti negativi a questa risposta sono assurdi. Questo è in effetti l'approccio preferito, perché questa query sarebbe in grado di sfruttare un indice signup_date, a differenza di altri approcci.
RandomSeed

2
@RandomSeed L'idea generale di testare signup_datetra due volte è corretta, ma i tempi non lo sono. Dovrebbe essere compreso tra 00:00e 23:59:59alla data corrente.
Barmar

Ebbene, anche l'intervallo di date era sbagliato>. <I voti negativi non erano poi così assurdi dopo tutto.
RandomSeed

Questa query è molto più performante (a causa dell'indice). Il WHERE DATE(signup_date) = CURDATE()mio server ha impiegato ~ 50 ms, questo qui 0,8 ms.
Kai Noack

13

Sembra che tu debba aggiungere la formattazione a 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 con Demo


1

È possibile utilizzare il CONCATcon CURDATE()per tutto il tempo del giorno e poi il filtro utilizzando la BETWEENin WHEREcondizione di:

SELECT users.id, DATE_FORMAT(users.signup_date, '%Y-%m-%d') 
FROM users 
WHERE (users.signup_date BETWEEN CONCAT(CURDATE(), ' 00:00:00') AND CONCAT(CURDATE(), ' 23:59:59'))
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.