Datetime uguale o maggiore di oggi in MySQL


175

Qual è il modo migliore per fare quanto segue:

SELECT * FROM users WHERE created >= today;

Nota: creato è un campo datetime.

Risposte:


329
SELECT * FROM users WHERE created >= CURDATE();

Ma penso che tu intenda created < today


11
CURDATE()ritorno solo data non ora
Shakti Singh

20
@ n00b come hai utenti che verranno creati in futuro ..? interesting =) Lo stavo usando per vedere se un post era ancora scaduto.
Garet Claborn,

75
SELECT * FROM myTable WHERE  DATE(myDate) = DATE(NOW())

Per saperne di più: http://www.tomjepson.co.uk/tutorials/36/mysql-select-where-date-today.html


6
Forse mi manca qualcosa, ma con i tipi DATETIME, la soluzione CURDATE () non funziona. Questo fa.
Jahmic,

inoltre, ciò richiede molto tempo in quanto vi è un sovraccarico di conversione di DATETIME ad oggi tramite la funzione DATE () e quindi il confronto con la condizione where.
Roopunk,

Non utilizzare le funzioni sulle colonne, fa sì che la query ignori l'indice, causando query lente. Controllare la mia risposta per approccio alternativo stackoverflow.com/a/42365426/4311336
Bsienn

33
SELECT * FROM users WHERE created >= NOW();

se la colonna è di tipo datetime.


1
intendo oggi non ora: D ho bisogno oggi come 2011-03-03 non 2011-03-03 14:02:02
n00b

@ n00b: restituirà righe maggiori di oggi non preoccuparti se il tempo è incluso
Shakti Singh

3
diciamo che è 2011-02-02 14:02:02 - gli utenti che sono stati creati alle 10:02:02 non verrebbero restituiti nella tua versione anche se sono stati creati "oggi" :)
n00b

@n00b: Lol ya, nessun utente sarebbe mai tornato, se solo potessimo fermare il tempo.
Mike Purcell,

15

Se "creato" è di tipo datetime

SELECT * FROM users WHERE created < DATE_ADD(CURDATE(), INTERVAL 1 DAY);

CURDATE () significa anche "2013-05-09 00:00:00"


Grazie per questo. In realtà avevo bisogno di DATE_SUB (usato allo stesso modo), ma questo mi ha messo sulla strada giusta.
Daniel Price,

Questo non restituirà i dati in cui la data contiene 0s in tempo, vale a dire che "2013-05-09 00:00:00" verrà perso
Bsienn,

8

La risposta contrassegnata è fuorviante. La domanda posta è DateTime, ma affermava che ciò che era necessario era giusto CURDATE().

La risposta più breve e corretta a questo è:

SELECT * FROM users WHERE created >= CURRENT_TIMESTAMP;

5

Se la colonna ha indice e una funzione è applicata sulla colonna, l'indice non funziona e si verifica la scansione della tabella completa, causando una query molto lenta.

Per utilizzare l'indice e confrontare il datetime con la data odierna / corrente, è possibile utilizzare quanto segue.

Soluzione per OP:

select * from users
where created > CONCAT(CURDATE(), ' 23:59:59')

Esempio per ottenere dati per oggi:

select * from users
where 
    created >= CONCAT(CURDATE(), ' 00:00:00') AND
    created <= CONCAT(CURDATE(), ' 23:59:59')

Oppure usa TRA in breve

select * from users 
where created BETWEEN 
      CONCAT(CURDATE(), ' 00:00:00') AND CONCAT(CURDATE(), ' 23:59:59')

2
SELECT * FROM users WHERE created >= now()

Questo non restituirà i record prima di questo momento da oggi.
gsziszi,

0

Il codice seguente ha funzionato per me.

declare @Today date

Set @Today=getdate() --date will equal today    

Select *

FROM table_name
WHERE created <= @Today

-1
SELECT * FROM table_name WHERE CONCAT( SUBSTRING(json_date, 11, 4 ) ,  '-', SUBSTRING( json_date, 7, 2 ) ,  '-', SUBSTRING(json_date, 3, 2 ) ) >= NOW();

json_date ["05/11/2011"]


Questa è una soluzione molto grezza
IgniteCoders

-5

puoi restituire tutte le righe e utilizzare la funzione phiff dateiff all'interno di un'istruzione if, anche se ciò caricherà ulteriormente il server.

if(dateDiff(date("Y/m/d"), $row['date']) <=0 ){    
}else{    
echo " info here";    
}

4
questo è molto lento rispetto alla selezione del database
IgniteCoders,
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.