TransWikia.com

comparar un array de fechas con fecha actual php

Stack Overflow en español Asked by user91940 on October 31, 2020

tengo una consulta en mi BD almaceno varias fechas y quiero hacer un filtrado con la fecha de hoy, me explico:

tengo esta tabla en my BD

introducir la descripción de la imagen aquí

En otra tabla obtengo el id_agencia el los values que arroja son de este formato 001-000 cuando selecciono el primer registro me da el codigo 001-008 para luego compararlo con la tabla de la imagen que se repite 3 veces y con ello puedo sacar esos 3 registros, los paso a un array usando la funcion str_split y en un row indico el campo de la tabla en este caso vFecha_Vigencia

Esta es mi consulta query:

$codigo=$_POST['id_agencia'];

$Query="SELECT * FROM TablaTarifa WHERE id_agencia='001-008'"; 

// o puede ser id_agencia='$codigo'"

Aqui puse 001-008 como cadena ya que en realidad obtengo ese string por POST cuando en javascript yo haga un onchange en un input ese mismo recoje el value del selectbox de las agencias y usando

$('#input1').on('change',function(){
            var id_agencia = document.getElementById("select1").value;
$.post("../carpeta/archivo.php",
       {
        id_agencia:id_agencia
        },
               function(data){
                    //mostrar el resultado final del php
                });

al tener la variable id_agencia pasado al php lo paso por POST en otra variable para comparar con un where

Despues de hacer la Query, Deposito el resultado en una variable, la variable $Result, $mysqli es la variable de conexión a la bd

$Result = $mysqli->query($Query);

Creo una variable en blanco para luego concatenarlo con el While que viene lineas abajo, esto con el fin de interpretar el array

$adb= "";

while ($row = $Result->fetch_assoc()) {
$adb.=$row['vFecha_Vigencia'];
}

El resultado que me arroja al imprimirlo con echo en consola es el siguiente

 <script>console.log(2018-01-012018-04-082018-06-17);</script>

como el id_agencia es 001_008 entonces la query me busca los resultados que contengan ese codigo y en la tabla hay 3 con ello, entonces lo que hago es como ya tengo fijado los 3 resultados solo quiero que me devuelva las fechas relacionadas al codigo de id_agencia el servidor me entiende que los arroja de manera junta sin separarlos, todo en un String “2018-01-012018-04-082018-06-17”
lo que hago para convertir el String en Array es usar la funcion str_split y como el formato de fecha son 10 digitos entonces le doy salto de 10 en 10

    $adb= "";

while ($row = $Result->fetch_assoc()) {
    $adb.=$row['vFecha_Vigencia'];
}

$Lista_de_Fechas = str_split($adb,10);

echo "<script>console.log( '" . json_encode($Lista_de_Fechas) . "' );</script>";

El nuevo resultado es el siguiente:

<script>console.log( 'Debug Objects Start: ["2018-01-01","2018-04-08","2018-06-17"]' );</script>

ya obtenido hasta aqui todo y explicado viene mi complicación, como puedo sacar la fecha mas cercana? es decir yo al sacar ese array y luego compararlo con la fecha de hoy como puedo sacar la fecha mas cercana o la fecha igual, esto es con el fin de filtrar ahora un solo resultado de la tabla y ya no 3 por eso hice todo ese tema del array de las 3 fechas ya que el código de id_agencia se repite en 3 registos de la tabla mysql… estuve buscando al respecto pero solo encuentro ejemplos de comparación de 2 fechas nada más y comparan de string a string.**

Aclaro mejor lo que trato de hacer lo que quiero es que el codigo reconozca que fecha es la menor a la fecha de hoy, por ejemplo si tengo 3 fechas 17 de setiembre, 22 de setiembre y 20 de setiembre y hoy día es 26 de setiembre, debo filtrar y sacar nada más el día 22 de setiembre ya que es la fecha mas cercana al 26 de setiembre…

Gracias por la paciencia y las posibles ayudas/sugerencias a dar 😀


EDITADO PARA ACLARAR MEJOR LA PREGUNTA Y HASTA DONDE TRATO DE LLEGAR

después de obtener una fecha por ejemplo:

el código es 001-008 y la fecha de hoy es 2018-09-26, cuando obtenga la fecha mas cercana (2018-06-17) apuntará a un sólo registro, es ahí donde yo tengo un sólo resultado en la Query y ahora puedo solicitar el campo Nro_Tarifa que sería 3 en la Imagen.

introducir la descripción de la imagen aquí

Osea: $Query2="SELECT Nro_Tarifa FROM TablaTarifa WHERE vFecha_Vigencia='2018-06-17'";

No podría ser 2018-09-24 ya que el código es distinto a 001-008

la Query2 me dará como resultado Nro_Tarifa = 3

con este número 3 yo puedo hacer otra query pero Para otra tabla llamada Tabla_Rangos

introducir la descripción de la imagen aquí

Teniendo esa Query puedo sacar esos 3 nuevos registros donde solicito esos 4 campos Rango_Inicial, Rango_Final, Monto_Tarifa, Tipo_Tarifa

con esos datos hago una comparación con un Número el cual el usuario ingresa por ejemplo:

El usuario ingresa 550 entonces en la tabla el rango seria de 200.01 a 1000.00 con esto ubico el rango de la query y obtengo el campo fijado de Monto_Tarifa que es 4 y con el otro campo Tipo_Tarifa, le digo al servidor si es Nominal o Porcentual, si obtengo la letra N entonces la variable se resta si obtengo % se multiplica y luego se resta, por ejemplo:

$numero='550';
$Tarifa = '4';
$variable= /*si es N se resta pero si es % multiplicar*/;

if ($variable==N) {
    $resultado=$numero-$Tarifa;
echo $resultado
} elseif ($variable==%) {
    $resultado=($numero*$Tarifa)-$numero;
echo $resultado;
} else {
    echo "Error";
}

En este caso es N entonces 550 – 4 y el resultado final sería 446.

ese 446 ahora lo paso a JavaScript con data, usando el codigo que está Líneas Arriba

$('#input1').on('change',function(){
            var id_agencia = document.getElementById("select1").value;
$.post("../carpeta/archivo.php",
       {
        id_agencia:id_agencia
        },
               function(data){
                 //AQUI ES DONDE SACO LA VARIABLE $RESPUESTA                        
                (#inputRespuesta).html(data);
                });

Si han llegado hasta aquí les doy las gracias por la semejante paciencia, he tratado de explicar detalladamente para que la lógica se pueda entender, si hay alguna sugerencia, errores en mi lógica o algo que cambiar o quizá pido datos demás y estoy repitiendo procesos, hacérmelo saber lo agradecería muchísimo. 😀

2 Answers

Lo que puedes hacer es iterar y comparar las fechas con Datetime::diff

public function fechaMasCercana($arrayFechas) {
    $datetimeHoy = new DateTimedate('Y-m-d'));
    $dateCercana = null;

    foreach($arrayFechas as $fecha) {
        $datetimeAComparar = new DateTime($fecha);
        $interval = $datetimeHoy->diff($datetimeAComparar);
        $format = interval->format('%r%a días');
        if(!$dateCercana || ($format < $dateCercana)){
            $dateCercana= $format
        }
        return $dateCercana
}

Más sobre DateTime::diff http://php.net/manual/es/datetime.diff.php

Answered by Sr1871 on October 31, 2020

Varias cosas. Primero, si no necesitas los otros dos resultados para nada, puedes usar este query:

$Query="SELECT * FROM TablaTarifa WHERE id_agencia='001-008' 
        ORDER BY vFechaVigencia DESC LIMIT 1";

Ahora si necesitas los tres, solo elimina el LIMIT 1 del query. Ademas, la razon por la que te sale un string todo junto es porque estas concatenando los resultados sin ningun caracter de separacion. Puedes hacerlo mas facil asi:

$Lista_de_Fechas = Array();

while ($row = $Result->fetch_assoc()) {
    $Lista_de_Fechas[] = $row['vFecha_Vigencia'];
}

echo "<script>console.log( '" . json_encode($Lista_de_Fechas) . "' );</script>";

Answered by alanfcm on October 31, 2020

Add your own answers!

Ask a Question

Get help from others!

© 2024 TransWikia.com. All rights reserved. Sites we Love: PCI Database, UKBizDB, Menu Kuliner, Sharing RPP