Pregunta:
Fecha: 08-07-2017 05:45:31
(En Español)
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:
Pero no tengo claro como ir recorriendo la tabla de la base de datos para esta busqueda.
Gracias....y soy nuevo en el foro. Votos: 0 - Respuestas: 4 - Vistas: 7 Compartir en: Google Facebook Twitter LinkedIn Link
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. 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 conecho 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
