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


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

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

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


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'))
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.