Consulta SQL para reportes por rango de fecha


La siguiente consulta SQL sirve para obtener un conjunto de registros mediante un rango de fecha, la fecha debe estar almacenada en un campo tipo date o date time.

Lo que haremos sera obtener todos los registros de una tabla donde el campo fecha sea mayor o igual a la fecha inicial y el campo fecha sea menor o igual a una fecha final.

Vamos a tomar en cuenta la siguiente tabla de una base de datos:

create table operation(
	id int not null auto_increment primary key,
	product_id int,
	q float,
	operation_type_id int,
	sell_id int,
	created_at datetime,
	foreign key (product_id) references product(id),
	foreign key (operation_type_id) references operation_type(id),
	foreign key (sell_id) references sell(id)
);

Tenemos que la fecha esta en el campo “created_at”, ustedes pueden usar el campo que tengan en sus tablas.

La consulta SQL para selección por rango de fecha seria así:

// consulta SQL con fechas
select * from operation where (created_at>="2019-01-01" and created_at<="2019-01-31") order by created_at desc

// consulta SQL con variables en PHP
select * from operation where (created_at>="$start" and created_at<="$end") order by created_at desc

// consulta SQL con Between con fechas
SELECT * FROM operation WHERE created_at BETWEEN "2019-01-01" AND "2019-01-31" order by created_at desc

// consulta SQL con Between con variables en PHP
SELECT * FROM operation WHERE created_at BETWEEN "$start" AND "$end" order by created_at desc

Les muestro 2 ejemplos, el primero insertando las fechas directamente y el segundo ejemplo usando variables.

Recordar que el formado de fecha es YYYY-MM-DD osea Año-mes-dia.

El “order by created_at desc” sirve para ordenar los registros del reciente al menos reciente osea del 31 de enero al 1 de enero, osea en orden cronologico invertido, si quieren que los registros aparezcan en orden cronológico deben quitar esta parte de order by.

Resultado

Saludos!


Leave a comment

2 thoughts on “Consulta SQL para reportes por rango de fecha

  • John Esteban Astete Arambarri

    Buenas amigo! Gracias por compartir tus conocimientos!
    Quería comentar que existe el operador BETWEEN para los rangos, y sería más sencilla la lógica para un rango entre dos fechas por ejemplo (SELECT * FROM tabla WHERE campo BETWEEN valor1 AND valor2)
    Saludos!