sql >> Base de Datos >  >> RDS >> Mysql

Desde la marca de tiempo en SQL, seleccionando registros de hoy, ayer, esta semana, este mes y entre dos fechas php mysql

Si está seleccionando solo por fecha, base sus cálculos en CURDATE (que devuelve solo la fecha) en lugar de NOW (que devuelve fecha y hora). Estos ejemplos capturarán todas las horas dentro de los rangos de días:

  • Hoy:WHERE timestamp >= CURDATE()
  • Ayer:WHERE timestamp >= DATE_SUB(CURDATE(), INTERVAL 1 DAY) AND timestamp < CURDATE()
  • Este mes:WHERE timestamp >= DATE_SUB(CURDATE(), INTERVAL DAYOFMONTH(CURDATE())-1 DAY)
  • Entre las dos fechas 3 de junio de 2013 y 7 de junio de 2013 (observe que la fecha de finalización se especifica como 8 de junio, no como 7 de junio):WHERE timestamp >= '2013-06-03' AND timestamp < '2013-06-08'

El "esta semana" depende de qué día comienzas tu semana; Te lo dejo a ti. Puede usar el DAYOFWEEK función para modificar CURDATE() a los rangos adecuados.

Anexo :el tipo de columna de OP era INTEGER , almacenando una marca de tiempo UNIX, y mi respuesta asumió que el tipo de columna era TIMESTAMP . Aquí se explica cómo hacer las mismas cosas con un valor de marca de tiempo UNIX y aún así mantener la optimización si la columna está indexada (como lo harán las respuestas anteriores si TIMESTAMP la columna está indexada)...

Básicamente, la solución es envolver las fechas de inicio y/o finalización en el UNIX_TIMESTAMP función:

  • Hoy:WHERE timestamp >= UNIX_TIMESTAMP(CURDATE())
  • Ayer:WHERE timestamp >= UNIX_TIMESTAMP(DATE_SUB(CURDATE(), INTERVAL 1 DAY)) AND timestamp < UNIX_TIMESTAMP(CURDATE())
  • Este mes:WHERE timestamp >= UNIX_TIMESTAMP(DATE_SUB(CURDATE(), INTERVAL DAYOFMONTH(CURDATE())-1 DAY))
  • Entre las dos fechas 3 de junio de 2013 y 7 de junio de 2013 (observe que la fecha de finalización se especifica como 8 de junio, no como 7 de junio):WHERE timestamp >= UNIX_TIMESTAMP('2013-06-03') AND timestamp < UNIX_TIMESTAMP('2013-06-08')