Necesito seleccionar todas las filas de mi base de datos que se crearon el mes pasado.
Por ejemplo, si el mes actual es enero, quiero devolver todas las filas que se crearon en diciembre, si el mes es febrero, quiero devolver todas las filas que se crearon en enero. Tengo una date_created
columna en mi base de datos que muestra la fecha creada en este formato: 2007-06-05 14:50:17
.
SELECT * FROM table WHERE date_created BETWEEN (CURRENT_DATE() - INTERVAL 1 MONTH) AND CURRENT_DATE();
between
incluye los límites. También incluirá la fecha actual. ¿Por qué / cómo se limitará a ayer? ¿Por favor elabora?current_date
no es hoy sino una fecha aleatoria dada por el cliente?Aquí tienes otra alternativa. Suponiendo que tiene un campo indexado
DATE
o deDATETIME
tipo, esto debería usar el índice, ya que las fechas formateadas se convertirán antes de usar el índice. A continuación, debería ver unarange
consulta en lugar de unaindex
consulta cuando se ve con EXPLAIN .SELECT * FROM table WHERE date_created >= DATE_FORMAT( CURRENT_DATE - INTERVAL 1 MONTH, '%Y/%m/01' ) AND date_created < DATE_FORMAT( CURRENT_DATE, '%Y/%m/01' )
fuente
STR_TO_DATE
alrededorDATE_FORMAT
para que siempre se trate de objetos de fecha.Si no hay fechas futuras ...
SELECT * FROM table_name WHERE date_created > (NOW() - INTERVAL 1 MONTH);
Probado.
fuente
Alternativamente a la respuesta de hobodave
SELECT * FROM table WHERE YEAR(date_created) = YEAR(CURRENT_DATE - INTERVAL 1 MONTH) AND MONTH(date_created) = MONTH(CURRENT_DATE - INTERVAL 1 MONTH)
Podría lograr lo mismo con EXTRACT, usando YEAR_MONTH como unidad, por lo que no necesitaría el AND, así:
SELECT * FROM table WHERE EXTRACT(YEAR_MONTH FROM date_created) = EXTRACT(YEAR_MONTH FROM CURDATE() - INTERVAL 1 MONTH)
fuente
YEAR_WEEK
intervalo temporal , por lo que tendría que recurrir a la respuesta de hobodave si necesita semanas en lugar de meses.SELECT * FROM yourtable where DATE_FORMAT(date_created, '%Y-%m') = date_format(DATE_SUB(curdate(), INTERVAL 1 month),'%Y-%m')
Esto debería devolver todos los registros del mes calendario anterior, a diferencia de los registros de los últimos 30 o 31 días.
fuente
Aunque la respuesta para esta pregunta ya ha sido seleccionada, creo que la consulta más simple será
SELECT * FROM table WHERE date_created BETWEEN (CURRENT_DATE() - INTERVAL 1 MONTH) AND CURRENT_DATE();
fuente
Esto funcionó para mí (selecciona todos los registros creados desde el mes pasado, independientemente del día en que ejecute la consulta este mes)
fuente
select fields FROM table WHERE date_created LIKE concat(LEFT(DATE_SUB(NOW(), interval 1 month),7),'%');
este podrá aprovechar un índice si su date_created está indexado, porque no aplica ninguna función de transformación al valor del campo.
fuente
Aquí está la consulta para obtener los registros del último mes:
SELECT * FROM `tablename` WHERE `datefiled` BETWEEN DATE_SUB( DATE( NOW( ) ) , INTERVAL 1 MONTH ) AND LAST_DAY( DATE_SUB( DATE( NOW( ) ) , INTERVAL 1 MONTH ) )
Saludos - saqib
fuente
Alternativa con condición única
SELECT * FROM table WHERE YEAR(date_created) * 12 + MONTH(date_created) = YEAR(CURRENT_DATE) * 12 + MONTH(CURRENT_DATE) - 1
fuente
SELECT * FROM table WHERE YEAR(date_created) = YEAR(CURRENT_DATE - INTERVAL 1 MONTH) AND MONTH(date_created) = MONTH(CURRENT_DATE - INTERVAL 1 MONTH)
fuente