2013-03-26 9 views
12

Sto cercando di ottenere la quantità totale di utenti registrati al giorno. Al momento sto usando questoMysql DATE_SUB (ORA(), INTERVALLO 1 GIORNO) 24 ore o giorno della settimana?

$sql = "SELECT name, email FROM users WHERE DATE_SUB(NOW(), INTERVAL 1 DAY) < lastModified" 

ma non sono sicuro se questo funziona al giorno o per 24 ore?

Ad esempio, un utente che ha registrato 22 ore fa non dovrebbe essere tornato ho proprio come l'utente di oggi (= Martedì)

+0

Si prega di consultare questo post http://stackoverflow.com/questions/589652/add-2-hours-to-corrente-time-in-mysql – Lazyprogrammer

risposta

23

lastModified è, presumibilmente, un datetime. Per convertirlo in una data, puoi semplicemente racchiuderlo in DATE(), ovvero DATE(lastModified). DATE() restituisce la parte della data di un valore datetime che è effettivamente 00:00 in quel giorno.

SELECT 
    name, 
    email 
FROM users 
WHERE DATE(lastModified) = DATE(DATE_SUB(NOW() , INTERVAL 1 DAY)) 

Usando questo per abbinare un WHERE anche se sarebbe inefficiente come tutte le righe richiederebbe DATA applicata a loro e quindi è probabilmente la scansione l'intera tabella. È più efficiente per confrontare lastModified ai limiti superiori e inferiori che stai cercando, in questo caso> = 00:00 SUBDATE(NOW(),INTERVAL 1 DAY) e < 00:00 NOW()

Pertanto è possibile utilizzare per rendere il vostro TRA selezionare dando la a seguire.

SELECT 
    name, 
    email 
FROM users 
WHERE lastModified 
    BETWEEN DATE(DATE_SUB(NOW() , INTERVAL 1 DAY)) 
    AND DATE (NOW()) 
8

Penso che è necessario

SELECT 
    name, 
    email 
FROM users 
WHERE DATE(lastModified) = DATE(NOW()) 

Questa efficacemente "giri al solo la data" e sarà quindi corrispondere solo i record "da mezzanotte".

Problemi correlati