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.