Fecha y hora igual o mayor que hoy en MySQL

175

¿Cuál es la mejor manera de hacer lo siguiente?

SELECT * FROM users WHERE created >= today;

Nota: creado es un campo de fecha y hora.

n00b
fuente

Respuestas:

329
SELECT * FROM users WHERE created >= CURDATE();

Pero creo que te refieres created < today

Clodoaldo Neto
fuente
11
CURDATE()solo regreso fecha no hora
Shakti Singh
20
@ n00b ¿cómo tiene usuarios que se creen en el futuro ...? interesante =) Estaba usando esto para ver si una publicación ya había expirado.
Garet Claborn
75
SELECT * FROM myTable WHERE  DATE(myDate) = DATE(NOW())

Leer más: http://www.tomjepson.co.uk/tutorials/36/mysql-select-where-date-today.html

Edmhs
fuente
66
Tal vez me falta algo, pero con los tipos DATETIME, la solución CURDATE () no funciona. Esto hace.
Jahmic
Además, esto lleva mucho tiempo ya que hay una sobrecarga de convertir DATETIME a la fecha a través de la función DATE () y luego comparar con la condición where.
roopunk
No use funciones en columnas, hace que la consulta ignore el índice, lo que provoca consultas lentas. Verifique mi respuesta para un enfoque alternativo stackoverflow.com/a/42365426/4311336
Bsienn
33
SELECT * FROM users WHERE created >= NOW();

si la columna es de tipo fecha y hora.

Shakti Singh
fuente
1
quiero decir hoy no ahora: D necesito hoy como 2011-03-03 no 2011-03-03 14:02:02
n00b
@ n00b: devolverá filas mayores que hoy, no se preocupe si se incluye el tiempo
Shakti Singh
3
digamos que es 2011-02-02 14:02:02 - los usuarios que se han creado a las 10:02:02 no se devolverán en su versión a pesar de que se crearon "hoy" :)
n00b
@ n00b: Jaja, no se devolvería ningún usuario, si pudiéramos detener el tiempo.
Mike Purcell
15

Si 'creado' es tipo de fecha y hora

SELECT * FROM users WHERE created < DATE_ADD(CURDATE(), INTERVAL 1 DAY);

CURDATE () significa también '2013-05-09 00:00:00'

bart
fuente
Gracias por esto. En realidad necesitaba DATE_SUB (usado de la misma manera), pero esto me puso en el camino correcto.
Daniel Price
Esto no devolverá datos donde la fecha contenga ceros a tiempo, es decir, se perderá '2013-05-09 00:00:00'
Bsienn
8

La respuesta marcada es engañosa. La pregunta planteada es DateTime, pero lo que se necesitaba era justo CURDATE().

La respuesta más corta y correcta a esto es:

SELECT * FROM users WHERE created >= CURRENT_TIMESTAMP;
JeffMan
fuente
5

Si la columna tiene índice y se aplica una función en la columna, el índice no funciona y se produce un escaneo completo de la tabla, lo que provoca una consulta realmente lenta.

Para usar el índice y comparar datetime con la fecha actual / actual, se puede usar lo siguiente.

Solución para OP:

select * from users
where created > CONCAT(CURDATE(), ' 23:59:59')

Muestra para obtener datos para hoy:

select * from users
where 
    created >= CONCAT(CURDATE(), ' 00:00:00') AND
    created <= CONCAT(CURDATE(), ' 23:59:59')

O use ENTRE para abreviar

select * from users 
where created BETWEEN 
      CONCAT(CURDATE(), ' 00:00:00') AND CONCAT(CURDATE(), ' 23:59:59')
Bsienn
fuente
2
SELECT * FROM users WHERE created >= now()
Silx
fuente
Esto no devolverá los registros antes de este momento a partir de hoy.
gsziszi
0

El siguiente código funcionó para mí.

declare @Today date

Set @Today=getdate() --date will equal today    

Select *

FROM table_name
WHERE created <= @Today
Rob Fahndrich
fuente
-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 ["05/11/2011"]

vpgodara
fuente
Esta es una solución muy cruda
IgniteCoders
-5

puede devolver todas las filas y luego usar la función de fechado de php dentro de una instrucción if, aunque eso supondrá una carga adicional en el servidor.

if(dateDiff(date("Y/m/d"), $row['date']) <=0 ){    
}else{    
echo " info here";    
}
Koney L Visinko
fuente
44
esto es muy lento en comparación con la selección de la base de datos
IgniteCoders