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.

Respostas:


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

Mas acho que você quer dizer created < today


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


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.


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'


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;

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')

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

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

-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"]


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";    
}

4
Isto é muito lento em comparação com o banco de dados, selecione
IgniteCoders
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.