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


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

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

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


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