tipos - MySQL: consulta para obtener todas las filas del mes anterior
obtener el mes de una fecha en mysql (9)
Necesito seleccionar todas las filas en mi base de datos que fueron creadas el mes pasado.
Por ejemplo, si el mes actual es enero, entonces quiero devolver todas las filas que se crearon en diciembre, si el mes es febrero, entonces quiero devolver todas las filas que se crearon en enero. Tengo una columna date_created
en mi base de datos que enumera la fecha creada en este formato: 2007-06-05 14:50:17
.
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ías lograr lo mismo con EXTRACT, usando YEAR_MONTH como unidad, por lo tanto, no necesitarías el AND, así:
SELECT * FROM table
WHERE EXTRACT(YEAR_MONTH FROM date_created) = EXTRACT(YEAR_MONTH FROM CURDATE() - INTERVAL
1 MONTH)
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
Aquí hay otra alternativa. Suponiendo que tiene un campo de tipo DATE
o DATETIME
indexado, este debería usar el índice ya que las fechas formateadas se convertirán antes de que se use el índice. Debería ver una consulta de range
lugar de una consulta de index
cuando se visualiza 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'' )
Aunque la respuesta a esta pregunta ya se ha seleccionado, creo que la consulta más simple será
SELECT *
FROM table
WHERE
date_created BETWEEN (CURRENT_DATE() - INTERVAL 1 MONTH) AND CURRENT_DATE();
Si no hay fechas futuras ...
SELECT *
FROM table_name
WHERE date_created > (NOW() - INTERVAL 1 MONTH);
Probado.
select fields FROM table WHERE date_created LIKE concat(LEFT(DATE_SUB(NOW(), interval 1 month),7),''%'');
este podrá aprovechar un índice si su fecha_creada está indexada, porque no aplica ninguna función de transformación al valor del campo.
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.
SELECT * FROM table
WHERE YEAR(date_created) = YEAR(CURRENT_DATE - INTERVAL 1 MONTH)
AND MONTH(date_created) = MONTH(CURRENT_DATE - INTERVAL 1 MONTH)
WHERE created_date >= DATE_ADD(LAST_DAY(DATE_SUB(NOW(), INTERVAL 2 MONTH)), INTERVAL 1 DAY)
AND created_date <= DATE_ADD(LAST_DAY(DATE_SUB(NOW(), INTERVAL 1 MONTH)), INTERVAL 0 DAY)
Esto funcionó para mí (selecciona todos los registros creados a partir del mes pasado, independientemente del día en que ejecute la consulta este mes)