MySQL Seleccionar fecha igual a hoy

96

Estoy tratando de ejecutar una declaración de selección de mysql donde mira la fecha de hoy y solo devuelve los resultados que se registraron en ese día actual. Actualmente he intentado lo siguiente, pero parece que no funciona.

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

Modifiqué mi SELECTdeclaración a esto, gracias chicos.

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

Jako
fuente
parece que signup_datees el campo de fecha y hora
Sergii Stotskyi
@Serjio Sí, actualmente es un campo de fecha y hora.
Jako
cuál es el tipo de datos de signup_datesi contiene la hora, entonces querrá usar el formato date_format en la WHEREcláusula para quitar la hora para que coincida conCURDATE()
Taryn
@bluefeet gracias, modifiqué mi script. Parece funcionar, pero cuando no hay resultados. mysql_num_rowsno muestra 0. Solo un espacio en blanco.
Jako

Respuestas:

197
SELECT users.id, DATE_FORMAT(users.signup_date, '%Y-%m-%d') 
FROM users 
WHERE DATE(signup_date) = CURDATE()
Barmar
fuente
¿Es necesario usar DATE () incluso si el campo es del tipo Fecha?
rashidnk
2
@rashidnk No. Aunque no lo dijo claramente en la pregunta, el campo aparentemente es de tipo DATETIME.
Barmar
2
Si bien esta solución es absolutamente correcta, no se escala bien (no se puede usar un índice signup_date, incluso si tal índice existe). Prefiero la solución de Serjio .
RandomSeed
o si se encuentra en una fecha en particular, con el índice que también se utiliza `` SELECT users.id, DATE_FORMAT (users.signup_date, '% Y-% m-% d') FROM users where signup_date> = '2017-08 -30 00:00:00 'y signup_date <=' 2017-08-30 23:59:59 '; ``
Sumit M Asok
3
@SumitMAsok Es mejor usarlo < '2017-08-31 00:00:00'en caso de que esté usando una versión de MySQL con milisegundos.
Barmar
29

Esta consulta usará index si lo tiene para el 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
fuente
Los votos negativos a esta respuesta son absurdos. De hecho, este es el enfoque preferido, porque esta consulta podría aprovechar un índice signup_date, a diferencia de otros enfoques.
RandomSeed
2
@RandomSeed La idea general de probar signup_dateentre dos tiempos es correcta, pero los tiempos no lo son. Debe ser entre 00:00y 23:59:59en la fecha actual.
Barmar
Bueno, el intervalo de fechas también era incorrecto>. <Los votos negativos no eran tan absurdos después de todo.
RandomSeed
Esta consulta es mucho más eficaz (debido al índice). El WHERE DATE(signup_date) = CURDATE()tomó mi servidor de ~ 50 ms, esta de aquí 0,8 ms.
Kai Noack
13

Parece que necesita agregar el formato a WHERE:

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

Ver SQL Fiddle con demostración

Taryn
fuente
1

Puede usar CONCATcon CURDATE()para todo el tiempo del día y luego filtrar usando la condición 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
fuente