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.

Respuestas:


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

Pero creo que te refieres created < today


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


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.


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'


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;

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

2
SELECT * FROM users WHERE created >= now()

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

-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"]


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";    
}

44
esto es muy lento en comparación con la selección de la base de datos
IgniteCoders
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.