Buscar por fechas en MySQL: Operador AND y BETWEEN
Comparar rango fechas correctamente en PHP & MySQL

Buscar por fechas en MySQL. En ocasiones tenemos que llegar a este tema de la búsqueda por rango de fechas en MySQL y en este artículo daremos 2 ejemplos completos para buscar fechas de una manera óptima.

Hay que analizar que la columna se de tipo date y deberías usar un "="
junto con el dato a comparar:
SELECT * FROM [tabla] WHERE [columna (date)] = [atributo (date)]
O un BETWEEN si es en un rango de fechas:
SELECT * FROM tablename WHERE columname BETWEEN '2021-09-25' AND '2021-10-25'
Con esto ya tenemos una idea para preparar nuestra consulta SQL, ya sea por una fecha o rango de fechas.
Buscar por fechas en MySQL
A continuación, mostraremos las dos formas para buscar por rangos de fechas.
a) Buscar usando operador AND de MySQL
La condición AND de MySQL (también llamada operador AND) se usa para probar dos o más condiciones en una instrucción SELECT, INSERT, UPDATE o DELETE.
Formulario HTML5
Nos permitirá la interfaz gráfica para recoger las fechas y posteriormente buscar en MySQL
<form action="" method="post"> <div class="col-md-3"> <label for="inputMarca">Fecha 01:</label> <input type="date" class="form-control" name="fecha1" value="<?php echo isset($_POST['fecha1'])?$_POST['fecha1']:''; ?>" required> </div> <div class="col-md-3"> <label for="inputMarca">Fecha 02:</label> <input type="date" class="form-control" name="fecha2" value="<?php echo isset($_POST['fecha2'])?$_POST['fecha2']:''; ?>" required> </div> <div class="col-md-3"> <div class="form-group"> <label> </label> <div> <button type="submit" name="submit" value="search" id="submit" class="btn btn-primary"><i class="fa fa-fw fa-search"></i> Buscar</button> </div> </div> </div> </form>
Condicional IF ELSE
Usaremos condicionales para optimizar la consulta SQL en el hipotético caso que el usuario no rellene el formulario o mostrar resultados por defecto en un determinado rango de fechas.
Caso contrario, mostrara los valores enviado por el formulario que desencadenara la búsqueda en MySQL. Por lo tanto, recuperamos los valores del formulario usando PHP.
if($_POST["fecha1"]!=""){ $fecha1 = htmlentities($_POST["fecha1"]); }else{ $fecha1 = date("Y-m-d",strtotime(date("Y-m-d")."- 1 month")); } //fecha 02 if($_POST["fecha2"]!=""){ $fecha2 = htmlentities($_POST["fecha2"]); }else{ $fecha2 = date("Y-m-d"); }
Proceso de la información SQL
Procesamos los valores del formulario haciendo uso de una consulta SQL mediante PDO que es el más recomendado por seguridad y optimización.
$stmt = $connect->prepare(" SELECT SUM(monto) from ingresos WHERE fecha >= :startDate AND fecha<= :endDate"); $stmt->bindParam(':startDate',$fecha1); $stmt->bindParam(':endDate',$fecha2); $stmt->execute(); $totali = $stmt->fetch(PDO::FETCH_NUM); $total_ingreso = $totali[0];
Imprimirá la suma de registros obtenidos en la consulta, en el ejemplo deseamos obtener el valor total de los ingresos a través de un rango de fechas.
b) Buscar usando operador BETWEEN
Si se trata de fechas, el más recomendado es el operador BETWEEN. Recordemos que este operador trabaja dentro de la cláusula WHERE en una consulta SQL para seleccionar valores entre un rango de datos.
$stmt = $connect->prepare("SELECT SUM(monto) from ingresos WHERE fecha BETWEEN :startDate AND :endDate"); $stmt->bindParam(':startDate',$fecha1); $stmt->bindParam(':endDate',$fecha2); $stmt->execute(); $totali = $stmt->fetch(PDO::FETCH_NUM); $total_ingreso = $totali[0];
c) Buscar y visualizar registros MySQL con FOREACH
El anterior ejemplo da como resultado la sumatoria de registros para obtener el monto total de una columna si se trata de mostrar dinero.
Aquí, les dejare un ejemplo si desean mostrar los registros en una lista y si desean pueden incorporar una tabla haciendo uso de ciclo foreach del PHP.
//Uso de consultas preparadas para evitar la Inyección SQL. $sql = "SELECT * FROM persona WHERE fecha_nacimiento BETWEEN :inicio AND :fin;"; $stmt = $pdo->prepare($sql); $stmt->bindValue(":inicio",$fecha1); $stmt->bindValue(":fin",$fecha2); $stmt ->execute(); $arrDatos = $stmt->fetchAll(PDO::FETCH_ASSOC); if ($arrDatos) { echo "<pre>"; echo "CONSULTA 1: SE ENCONTRARON ".count($arrDatos). " REGISTROS\n"; print_r($arrDatos); $strLista="\n\nLISTA DE DATOS CONSULTA 1:\n"; foreach ($arrDatos as $row) { echo "Id: ".$row["persona_id"]; echo "Nombre: ".$row["persona_nom"]; echo "Fecha: ".$row["fecha_nacimiento"]; } echo "</pre>"; } else { echo "No hay datos"; }
Conclusión
Si tienen problemas con filtrar fechas en MySQL aquí hemos aprendido dos formas para lograr el objetivo deseado. Sin embargo, el método más recomendado es usar el operador BETWEEN.
Si están trabajando con consultas SQL, lo recomendado es usar la conexión PDO y también en la programación. Por lo tanto, recordemos que PDO tiene que estar configurado para la seguridad.
Otro detalle, debemos de hacer uso de PDO en las consultas preparadas para evitar la Inyección SQL.
Espero que esta explicación sea de su agrado y les ayude en sus proyectos web.
Hola como estas, tengo una duda cuando utilizo el codig de al consulta me funciona pero me vota menos un dato es decir tengo en mi base 3 fechas las cuales son 3 4 5 de mayo pero al rato de imprimirlas solo me da el 3 y el 4
Muy buenas noches amigo, excelente forma de explicar es usted todo un maestro, amigo estoy intentando hacer una consulta pero que me permita elegir entre un usuario especifico y un rango de fechas (fecha inicial y fecha final) lógicamente también seleccionadas por mi, pero hasta el momento no he dado con alguien que me pueda colaborar con algún código o algún video. Cabe destacar que soy un novato en esto de la programación en PHP. Mucho sabría agradecer su colaboración y agradezco de antemano su colaboración prestada.
Hola Edwin
La variable $usuario es definida por usted o extraida de una base de datos.
Saludos