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.