Data e hora iguais ou maiores que hoje no MySQL

175

Qual é a melhor maneira de fazer o seguinte:

SELECT * FROM users WHERE created >= today;

Nota: criado é um campo de data e hora.

n00b
fonte

Respostas:

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

Mas acho que você quer dizer created < today

Clodoaldo Neto
fonte
11
CURDATE()retornar apenas data não hora
Shakti Singh
20
@ n00b como você tem usuários criados no futuro ..? interessante =) Eu estava usando isso para ver se uma postagem expirou ainda.
Garet Claborn
75
SELECT * FROM myTable WHERE  DATE(myDate) = DATE(NOW())

Leia mais: http://www.tomjepson.co.uk/tutorials/36/mysql-select-where-date-today.html

Edmhs
fonte
6
Talvez esteja faltando alguma coisa, mas com os tipos DATETIME, a solução CURDATE () não funciona. Isso faz.
Jahmic
além disso, leva muito tempo, pois há uma sobrecarga na conversão de DATETIME para data por meio da função DATE () e, em seguida, a comparação com a condição where.
roopunk
Não use funções em colunas, isso faz com que a consulta ignore o índice, causando consultas lentas. Verifique minha resposta para abordagem alternativa stackoverflow.com/a/42365426/4311336
Bsienn
33
SELECT * FROM users WHERE created >= NOW();

se a coluna for do tipo data e hora.

Shakti Singh
fonte
1
quero dizer hoje não agora: D eu preciso hoje como 2011-03-03 não 2011-03-03 14:02:02
n00b
@ n00b: ele irá retorna linhas maiores do que hoje não se preocupe se o tempo está incluído
Shakti Singh
3
digamos que seja 02-02-2011 14:02:02 - os usuários criados às 10:02:02 não seriam retornados na sua versão mesmo que tivessem sido criados "hoje" :)
n00b
@ n00b: Muito bem, nenhum usuário seria retornado, se pudéssemos parar o tempo.
Mike Purcell
15

Se 'criado' for do tipo data e hora

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

CURDATE () significa também '2013-05-09 00:00:00'

bart
fonte
Obrigado por isso. Na verdade, eu precisava do DATE_SUB (usado da mesma maneira), mas isso me colocou no caminho certo.
Daniel Price
Isso não retornará dados em que a data contenha 0s no tempo, ou seja, '2013-05-09 00:00:00' será perdida
Bsienn
8

A resposta marcada é enganosa. A pergunta declarada é DateTime, mas afirmou que o necessário era apenasCURDATE() .

A resposta mais curta e correta para isso é:

SELECT * FROM users WHERE created >= CURRENT_TIMESTAMP;
JeffMan
fonte
5

Se a coluna tiver índice e uma função for aplicada na coluna, o índice não funcionará e ocorrerá uma verificação completa da tabela, causando uma consulta muito lenta.

Para usar o índice e comparar data e hora com a data de hoje / atual, é possível usar o seguinte.

Solução para OP:

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

Exemplo para obter dados de hoje:

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

Ou use BETWEEN para abreviar

select * from users 
where created BETWEEN 
      CONCAT(CURDATE(), ' 00:00:00') AND CONCAT(CURDATE(), ' 23:59:59')
Bsienn
fonte
2
SELECT * FROM users WHERE created >= now()
Silx
fonte
Isso não retornará os registros antes deste momento a partir de hoje.
gsziszi 15/03
0

O código abaixo funcionou para mim.

declare @Today date

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

Select *

FROM table_name
WHERE created <= @Today
Rob Fahndrich
fonte
-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 ["11/05/2011"]

vpgodara
fonte
Esta é uma solução muito cru
IgniteCoders
-5

você pode retornar todas as linhas e, em seguida, usar a função php datediff em uma instrução if, embora isso coloque uma carga extra no servidor.

if(dateDiff(date("Y/m/d"), $row['date']) <=0 ){    
}else{    
echo " info here";    
}
Koney L Visinko
fonte
4
Isto é muito lento em comparação com o banco de dados, selecione
IgniteCoders