Nueva pregunta

Pregunta:

Fecha: 08-07-2017 05:45:31 (En Español)

Selección de fechas y cálculo entre registros contiguos timestamp en base de datos MySQL [No resuelta]

Hola,

Estoy tratando de solucionar un problema y quiero ver si alguien me da una idea de como abordarlo.

Tengo una tabla MySQL con registros de la siguiente manera:

id maquina fecha ( CURRENT_TIMESTAMP)
1 5 2017-07-03 08:34:11
2 5 2017-07-03 08:34:40
3 5 2017-07-03 08:35:15

Son cientos de registros así y quiero ir comparando sucesivamente si entre ellos hay menos de 30 segundos, debería contarlos como fallos.

Ejemplo: entre 1-2 hay menos de 30 segundos luego seria un fallo pero entre 2-3 hay más de 30 segundos luego no se tomaria en cuenta.

Segun lo que he leido tendria que pasar la fecha en timestamp a UNIX timestamp y trabajar con Diff y en segundos.

Alguien me podria decir si ese es el mejor camino o si hay alguna función mas especifica.

El tema de buscar en el rango de fechas lo hago con la consulta:
$result = mysql_query("select id from seguimiento where krono BETWEEN '$fecha_inicial' AND '$fecha_final'"); 


Pero no tengo claro como ir recorriendo la tabla de la base de datos para esta busqueda.

Gracias....y soy nuevo en el foro.
Etiquetas: MySQL - MySQL Desarrollo - PHP - Pregunta - Query Votos: 0 - Respuestas: 4 - Vistas: 7 Compartir en: Google Facebook Twitter LinkedIn Link
 

Respuestas:

  • Fecha: 08-07-2017 11:43:51 yo lo haria de esta manera, almacenaria las fechas en un array, luego las recorro enviandolas a una funcion que calcule la diferencia entre ellas y me devuelva el resultado. Por ejemplo:

    //Arreglo de fechas
    $data = array(
    	'2017-07-03 08:34:11',
    	'2017-07-03 08:34:40',
    	'2017-07-03 08:35:15'
    	);
    //Contador de Fallos
    $fallos = 0;
    
    //Calcula la diferencia entre fechas
    function dife($X){
    	$fecha1 = new DateTime($X[1]);
    	$fecha2 = new DateTime($X[0]);
    	$fecha = $fecha1->diff($fecha2);
    	return $fecha->s;//retorna los segundos de direfencia
    }
    
    //recorro las fechas
    for($i=0; $i<count($data); $i++){
    	$temp = (dife(array($data[($i+1)], $data[$i])));//envio a la funcion las fechas a comparar
    	$fallos = ($temp<30) ? $fallos+1 : $fallos;//si se cumple la condición sumo un fallo al contador
    }
    
    //retorno los fallos
    echo $fallos;
    


    esto me imprime 2 Fallos entre esas fechas
      Votos: 0 - Link respuesta
     
  • Fecha: 08-07-2017 18:47:03 Hola.
    gracias por la respuesta, pero tengo la siguientes dudas

    1. a que se debe el error

    Undefined offset en la linea

    $temp = (dife(array($data[($i+1)], $data[$i])));


    he estado leyendo y un foro decia que es un tema del php.ini , es asi ?.


    2. como soy algo nuevo en php , tengo problemas en la consulta a la tabla mysql para obtener ese array y recorrerlo.

    debiera ser capaz de generar por ejemplo

    array(5) { [0]=> string(19) "2017-07-03 08:34:01" [1]=> string(19) "2017-07-03 08:34:10" [2]=> string(19) "2017-07-03 08:34:21" [3]=> string(19) "2017-07-03 08:34:29" [4]=> string(19) "2017-07-03 08:34:33" }

    pero con mi codigo que es el siguiente

    $fecha_inicial = '2017-07-04';
    $fecha_final = '2017-07-07';
    $sql_select = "SELECT krono FROM seguimiento WHERE krono BETWEEN '$fecha_inicial' AND '$fecha_final'";
    
    try{
    	$query_select = $conecta->prepare($sql_select);
        $query_select->execute();
    	$resultado_query = $query_select->fetchAll(PDO::FETCH_ASSOC);
    	
    	$count = $query_select->rowCount(PDO::FETCH_ASSOC);
    	
    }catch (PDOexception $error_select){
       echo 'Error al selecionar '.$error_select->getMessage();
    }
        
    	if($count == '0'){
    	  echo 'Nada encontrado'; 	
    	}else{
    	
    	foreach($resultado_query as $res){
    		$data = $res['krono'];
    		
    		echo $data.'<br />';
    		
    		
    	}
    	}


    verificando con
    echo var_dump($data);
    solo logro generar

    string(19) "2017-07-04 09:33:01" string(19) "2017-07-04 09:33:10" string(19) "2017-07-04 09:33:43" string(19) "2017-07-04 09:33:59"

    es decir no estoy generando el array de string.

    alguien me puede decir como generar el array a partir de la consulta ?.

    lei el siguiente post del foro pero no me aclaro la situación

    http://www.phpcentral.com/pregunta/481/como-cargar-una-consulta-de-mysql-a-un-array-php.

    se que hay que cambiar la consulta pero no se como...si con fetch column o algo asi.

    gracias

    p.d: avisenme porfavor si por las reglas hay que generar otra pregunta para este ultimo punto
      Votos: 0 - Link respuesta
     
  • Fecha: 09-07-2017 03:50:13 ok ya veo, bueno debes crearte el array vacio primeramente, ve el siguiente ejemplo modificado incluso la función se ha modificado para ser mas exacta:

    function dife($X){
    	$fecha1 = strtotime($X[1]);
    	$fecha2 = strtotime($X[0]);
    	$fecha = $fecha2-$fecha1;
    	return $fecha;
    }
    
    //Iniciamos el array
    $data = array();
    
    //conectamos a la tabla
    $a = $db->query("SELECT * FROM fechas");
    $t = mysqli_num_rows($a);
    
    //recorremos los resultados
    while($row = $a->fetch_array()){
    	//agregamos las fechas al array
    	array_push($data, $row['fecha']);
    }
    
    //Iniciamos las variables
    $fallos = 0;//Cantidad de fallos encontrados
    $cantidad = count($data)-1;//contamos la cantidad de registros del array y le restamos 1;
    $ini = 1;//Iniciamos el for a partir del segundo registro
    
    //Recorremos el array iniciando por el segundo registro
    for($i=$ini; $i<=$cantidad; $i++){
    	//Validamos la diferencia de las fechas
    	$temp = (dife(array($data[$i], $data[($i-1)])));
    	//Si se cumple la condición sumamos un fallo
    	$fallos = ($temp<=30) ? $fallos+1 : $fallos;
    }
    
    echo $fallos."<br>";
    


    basandonos en el siguiente array:
    Array ( [0] => 2017-07-09 01:01:15 [1] => 2017-07-09 01:01:27 [2] => 2017-07-09 01:02:00 [3] => 2017-07-09 01:03:13 )

    esto nos retorna que se a cumplido 1 error con diferencia de 30 seg o menos
      Votos: 0 - Link respuesta
     
  • Fecha: 12-07-2017 05:35:28 gracias por responder, el codigo funciona muy bien, voy a intentar ajustar la consulta a PDO . sinceramente muchas gracias   Votos: 0 - Link respuesta
     
Para participar activamente de la comunidad primero debes autenticarte, ingresa al sistema.Iniciar Sesión
 
frjcbbae garagebible.com