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.