MySQL Selecionar data igual a hoje

96

Estou tentando executar uma instrução select do mysql onde olha para a data de hoje e retorna apenas os resultados registrados naquele dia. Atualmente, tentei o seguinte, mas não parece funcionar.

SELECT users.id, DATE_FORMAT(users.signup_date, '%Y-%m-%d') 
    FROM users 
    WHERE users.signup_date = CURDATE()

Eu modifiquei minha SELECTdeclaração para isso, obrigado pessoal.

SELECT id FROM users WHERE DATE(signup_date) = CURDATE()

Jako
fonte
parece que signup_dateé o campo datetime
Sergii Stotskyi 01/10/12
@Serjio Sim, atualmente é um campo de data e hora.
Jako
qual é o tipo de dados signup_datese ele contém a hora, então você desejará usar o date_format na WHEREcláusula para retirar a hora para corresponder aCURDATE()
Taryn
@bluefeet obrigado, modifiquei meu script. Parece funcionar, mas quando não há resultados. mysql_num_rowsnão exibe 0. Apenas um espaço em branco.
Jako

Respostas:

197
SELECT users.id, DATE_FORMAT(users.signup_date, '%Y-%m-%d') 
FROM users 
WHERE DATE(signup_date) = CURDATE()
Barmar
fonte
é necessário usar DATE () mesmo o campo do tipo Data?
rashidnk
2
@rashidnk Não. Embora ele não tenha dito claramente na pergunta, o campo é aparentemente do tipo DATETIME.
Barmar
2
Embora essa solução seja absolutamente correta, ela não se ajusta bem (não é possível usar um índice signup_date, mesmo que esse índice exista). Prefira a solução de Serjio .
RandomSeed
ou se para encontrar em uma data particular, com o índice também sendo utilizado `` `SELECT users.id, DATE_FORMAT (users.signup_date, '% Y-% m-% d') DE usuários onde signup_date> = '2017-08 -30 00:00:00 'e signup_date <=' 2017-08-30 23:59:59 '; `` `
Sumit M Asok
3
@SumitMAsok Melhor usar < '2017-08-31 00:00:00'caso você esteja usando uma versão do MySQL com milissegundos.
Barmar
29

Esta consulta usará o índice se você o tiver para o signup_datecampo

SELECT users.id, DATE_FORMAT(users.signup_date, '%Y-%m-%d') 
    FROM users 
    WHERE signup_date >= CURDATE() && signup_date < (CURDATE() + INTERVAL 1 DAY)
Sergii Stotskyi
fonte
Votos negativos para esta resposta são absurdos. Na verdade, essa é a abordagem preferida, porque essa consulta seria capaz de alavancar um índice signup_date, ao contrário de outras abordagens.
RandomSeed
2
@RandomSeed A ideia geral de testar signup_dateentre duas vezes está correta, mas os tempos não. Deve ser entre 00:00e 23:59:59na data atual.
Barmar de
Bem, o intervalo de datas também estava errado>. <Os votos negativos não eram tão absurdos assim.
RandomSeed
Esta consulta tem muito mais desempenho (devido ao índice). O WHERE DATE(signup_date) = CURDATE()meu servidor demorou ~ 50 ms, este aqui 0,8 ms.
Kai Noack
13

Parece que você precisa adicionar a formatação ao WHERE:

SELECT users.id, DATE_FORMAT(users.signup_date, '%Y-%m-%d') 
FROM users 
WHERE DATE_FORMAT(users.signup_date, '%Y-%m-%d') = CURDATE()

Veja SQL Fiddle com Demo

Taryn
fonte
1

Você pode usar CONCATcom CURDATE()para toda a hora do dia e, em seguida, filtrar usando a condição BETWEENin WHERE:

SELECT users.id, DATE_FORMAT(users.signup_date, '%Y-%m-%d') 
FROM users 
WHERE (users.signup_date BETWEEN CONCAT(CURDATE(), ' 00:00:00') AND CONCAT(CURDATE(), ' 23:59:59'))
Tanakom Talawat
fonte