Foro oficial de PHP

asumiendo dos cosas :p

1. que entendi bien
2. que usa MySQL

lo que pide se puede hacer con una sola consulta, el resultado de esta ya lo tratara como necesite

SELECT COUNT(*) AS Reingreso FROM tabla
WHERE FechaSalida BETWEEN DATE_SUB(NOW(), INTERVAL 1 DAY) AND NOW() AND Id = XXX
-- XXX = id del cliente o si lo desea puede cambairlo por la cedula

si el resultado de la consulta es >= 1 pues es un reingreso :)
 
asumiendo dos cosas :p

1. que entendi bien
2. que usa MySQL

lo que pide se puede hacer con una sola consulta, el resultado de esta ya lo tratara como necesite

SELECT COUNT(*) AS Reingreso FROM tabla
WHERE FechaSalida BETWEEN DATE_SUB(NOW(), INTERVAL 1 DAY) AND NOW() AND Id = XXX
-- XXX = id del cliente o si lo desea puede cambairlo por la cedula

si el resultado de la consulta es >= 1 pues es un reingreso :)

Uso PostgreSQL como BD, pero puedo hacer esa consulta, sin embargo creo que esa consulta funcionaría pero no para obtener los reingresos desde el 2008 porque con DATE_SUB estaría restando 1 día a hoy, por lo que me serviría para obtener los reingresos de hoy pero no los del mes pasado, por ejemplo.

Creo que se puede hacer algo como lo siguiente:
PHP:
<?php
    $reingresos = 0;
    $sql="SELECT * FROM ingresos WHERE fecha_ingreso BETWEEN '2010-01-01' AND '2010-01-30' ORDER BY fecha_ingreso ASC;
    $result=pg_query($sql);
    while($row = pg_fetch_assoc($result)){
        $horas=$row[+1,'fechaIngreso']-$row['fechaSalida'];
        if (ceil($horas)<25){
            $reingresos++;
        }
    }
    echo "Los reingresos del mes fueron: ".$reingresos;
?>

Donde el +1 sería el siguiente registro del array obtenido. Lo pongo así para tratar de hacerme entender aunque se que ese +1 me va a dar un error. ¿Qué opinan? ¿Hay una forma de saltar al siguiente registro?
 
Saludos a todos

Tengo una tabla en base de datos con los siguientes campos: id, Cedula, FechaEntrada, FechaSalida. Como ejemplo, una persona puede venir a mi almacén hoy a las 2:00 pm y salir a las 3:15 pm (Con esto se completaría el primer registro) La misma persona regresa mañana a las 2:30 pm por lo cual el cliente del almacén regresó antes de que pasara 24 horas desde su más reciente salida, lo cual, para el negocio, se toma como un reingreso.

Actualmente lo estoy haciendo con 2 consultas en while (El primer while se posiciona en el primer campo y con el segundo while compara con las demás entradas al almacen) esta es una forma eficaz pero no eficiente pues la ejecución del script se demora mucho sobre todo cuando muchas personas han venido muchas veces al almacén.

¿Alguien tiene alguna idea de cómo hacerlo más eficientemente? Creo que en teoría se puede hacer con solo una consulta y que compare solo contra el siguiente registro pero no se como agregarle el +1 al array de la consulta SQL.


Pues fácil

Teniendo en cuenta que en la tabla se almacena información de ingreso y reingreso es decir solo debe haber 1 solo ingreso que es cuando la persona va por primera vez y los demás serán reingreso. Partiendo de esto podemos hacer un group by cedula y restarle uno al campo. Algo asi

Select count(*) - 1 from tabla group by cedula;


Así sabríamos el número de reingreso de cada cedula.




Como recomendación no manejaria esa informa en una sola tabla, se repetiría mucho la información lo ideal sería tener dos tablas

Tabla1: id, cedula
Tabla2:idtabla1,FechaIngreso,FechaSalida

El campo cedula no se repetiría cada vez que entra un cliente, solo se almacenaria la información con fecha de entrada y salida

Enviado desde mi LG-D805 mediante Tapatalk
 
Pues fácil

Teniendo en cuenta que en la tabla se almacena información de ingreso y reingreso es decir solo debe haber 1 solo ingreso que es cuando la persona va por primera vez y los demás serán reingreso. Partiendo de esto podemos hacer un group by cedula y restarle uno al campo. Algo asi

Select count(*) - 1 from tabla group by cedula;


Así sabríamos el número de reingreso de cada cedula.




Como recomendación no manejaria esa informa en una sola tabla, se repetiría mucho la información lo ideal sería tener dos tablas

Tabla1: id, cedula
Tabla2:idtabla1,FechaIngreso,FechaSalida

El campo cedula no se repetiría cada vez que entra un cliente, solo se almacenaria la información con fecha de entrada y salida

Enviado desde mi LG-D805 mediante Tapatalk

Solo es reingreso si se registró en menos de 24 horas al anterior ingreso.

Enviado desde mi XT1032 mediante Tapatalk
 
Teniendo en cuenta que en la tabla se almacena información de ingreso y reingreso es decir solo debe haber 1 solo ingreso que es cuando la persona va por primera vez y los demás serán reingreso. Partiendo de esto podemos hacer un group by cedula y restarle uno al campo.

Una persona puede ir varias veces y a diferentes horas en el mes, solo se considera reingreso cuando una persona regresa al almacén en las siguientes 24 horas a su más reciente salida. Por ejemplo, un cliente va el lunes y regresa el viernes (No es reingreso) un cliente va el martes a las 7:00 am y sale a las 10:00 am y regresa el miercoles a las 8:00 am (Es reingreso porque no han pasado más de 24 hs para que el cliente regrese al almacén)
 
Uso PostgreSQL como BD, pero puedo hacer esa consulta, sin embargo creo que esa consulta funcionaría pero no para obtener los reingresos desde el 2008 porque con DATE_SUB estaría restando 1 día a hoy, por lo que me serviría para obtener los reingresos de hoy pero no los del mes pasado, por ejemplo.

Creo que se puede hacer algo como lo siguiente:
PHP:
<?php
    $reingresos = 0;
    $sql="SELECT * FROM ingresos WHERE fecha_ingreso BETWEEN '2010-01-01' AND '2010-01-30' ORDER BY fecha_ingreso ASC;
    $result=pg_query($sql);
    while($row = pg_fetch_assoc($result)){
        $horas=$row[+1,'fechaIngreso']-$row['fechaSalida'];
        if (ceil($horas)<25){
            $reingresos++;
        }
    }
    echo "Los reingresos del mes fueron: ".$reingresos;
?>

Donde el +1 sería el siguiente registro del array obtenido. Lo pongo así para tratar de hacerme entender aunque se que ese +1 me va a dar un error. ¿Qué opinan? ¿Hay una forma de saltar al siguiente registro?

lo supuse ;)
estaba esperando la respuesta, para el requerimiento original esa respuesta es valida, pero ahora con mas info puedo decir:

1. se puede sustituir el NOW() por cualquier fecha/campo fecha (a eleccion suya)
2. la sentencia que di saca como resultado el COUNT entre ayer y hoy pero con 1 sacara los resultados para 'fecha - 1 dia' y fecha
3. para el caso que nos concierne basta reemplazar el DATE_SUB por su contraparte DATE_ADD en 1, 2 y quedara entre fecha y 'fecha + 1'
 
lo supuse ;)
estaba esperando la respuesta, para el requerimiento original esa respuesta es valida, pero ahora con mas info puedo decir:

1. se puede sustituir el NOW() por cualquier fecha/campo fecha (a eleccion suya)
2. la sentencia que di saca como resultado el COUNT entre ayer y hoy pero con 1 sacara los resultados para 'fecha - 1 dia' y fecha
3. para el caso que nos concierne basta reemplazar el DATE_SUB por su contraparte DATE_ADD en 1, 2 y quedara entre fecha y 'fecha + 1'

Uy, quedé un poco perdido. Tengo una tabla como la siguiente:
reingreso-0.jpg

Lo que debo comparar es el campo fechaIngreso del id 3 - fechaSalida del id 2 si el resultado es menor o igual a 24 hs cuento como reingreso. En el ejemplo tendría 1 reingreso (El id 3).
 
Código:
-- contar cuantos registros hay entre la ultima fecha de ingreso y un dia antes a esta, util para los nuevos registros
SELECT COUNT(*) AS Reingreso FROM ingresos
WHERE fechaSalida BETWEEN DATE_SUB(fechaIngreso, INTERVAL 1 DAY) AND fechaIngreso AND cedula = 1098
ORDER BY fechaIngreso DESC

Código:
-- contar cuantos registros hay entre la fecha de ingreso y un dia despues a esta, util para viejos registros
SELECT COUNT(*) AS Reingreso FROM ingresos 
WHERE fechaSalida BETWEEN fechaIngreso AND DATE_ADD(fechaIngreso, INTERVAL 1 DAY) AND cedula = 1098

con el DATE_SUB se podria hacer desde el registro 1 pero este devolveria CERO ;) (no hay registros/fechas anteriores)
con el DATE_ADD se puede hacer desde el registro 1, el ultimo (o ultimos registros si son cedulas diferentes) devolvera(n) CERO

por supuesto en una tabla con muchos registros/cedulas este SQL devolvera solo un numero (para esa cedula), toca discriminar por fecha y hacer un loop sobre el resultado (ese loop si con PHP)
 
Uy, quedé un poco perdido. Tengo una tabla como la siguiente:
reingreso-0.jpg

Lo que debo comparar es el campo fechaIngreso del id 3 - fechaSalida del id 2 si el resultado es menor o igual a 24 hs cuento como reingreso. En el ejemplo tendría 1 reingreso (El id 3).
A grandes rasgos en sql puede hacer un inner join entre la tabla y ella misma nombrandolas t1 y t2, y en el on pone t2.id=t1+1 así tiene en memoria una tabla dónde puede comparar la resta entre t1.fechasalida y t2.fechaingreso y con un case cuenta lo que considere reingreso.

Sent from my LG-D801 using Tapatalk
 
Uy, quedé un poco perdido. Tengo una tabla como la siguiente:
reingreso-0.jpg

Lo que debo comparar es el campo fechaIngreso del id 3 - fechaSalida del id 2 si el resultado es menor o igual a 24 hs cuento como reingreso. En el ejemplo tendría 1 reingreso (El id 3).
Use en PostreSQL Windows functions, con lag creo que podría tener lo que necesita, ordenando por cedula

Sería algo como:

Código:
SELECT id, cedula, fechaIngreso, fechaSalida, CASE WHEN (lag(fechaSalida, 1) + Interval '1 day' < fechaIngreso) THEN true ELSE false END AS reingreso
FROM ingresos WHERE fecha_ingreso BETWEEN '2010-01-01' AND '2010-01-30' ORDER BY cedula, id ASC;

No tengo PostreSQL aquí para probar... pero es la idea

Tendrías que agregar algunas validaciones para el primer registro de la consulta y el de cada cédula... aunque el lag debería retornar null cuando no existe el primero debería funcionar

Es más, creo que el CASE se podría obviar y la consulta sería aún más simple:

Código:
SELECT id, cedula, fechaIngreso, fechaSalida, (lag(fechaSalida, 1) + Interval '1 day' < fechaIngreso) AS reingreso
FROM ingresos WHERE fecha_ingreso BETWEEN '2010-01-01' AND '2010-01-30' ORDER BY cedula, id ASC;

La comparación debería retornar directamente el true/false!
 
Última edición:
Código:
-- contar cuantos registros hay entre la fecha de ingreso y un dia despues a esta, util para viejos registros
SELECT COUNT(*) AS Reingreso FROM ingresos
WHERE fechaSalida BETWEEN fechaIngreso AND DATE_ADD(fechaIngreso, INTERVAL 1 DAY) AND cedula = 1098

con el DATE_ADD se puede hacer desde el registro 1, el ultimo (o ultimos registros si son cedulas diferentes) devolvera(n) CERO

Lo probé en local pero no devuelve los datos acertadamente. Analizando la consulta veo que en con el WHERE
Código:
WHERE fechaSalida BETWEEN fechaIngreso AND DATE_ADD(fechaIngreso, INTERVAL 1 DAY)
Solo tendría en cuenta los registros en los que el cliente haya estado en el almacén por 1 día. Y la idea es obtener los clientes que hayan salido del almacén y regresado en las siguientes 24hs.

A grandes rasgos en sql puede hacer un inner join entre la tabla y ella misma nombrandolas t1 y t2, y en el on pone t2.id=t1+1 así tiene en memoria una tabla dónde puede comparar la resta entre t1.fechasalida y t2.fechaingreso y con un case cuenta lo que considere reingreso.

Sent from my LG-D801 using Tapatalk

Lo intenté así pero no evalúa correctamente, es como si a pesar de que las tablas tienen alias distintos siempre evalúa sobre el mismo registro, es decir, siempre evalúa fechaIngreso de id=1 - fechaSalida de id=1 (No pasa al siguiente registro a pesar de agregarle el +1)

En general he intentado de muchas formas con SQL pero no he podido aunque las opciones que me han dado me sirven para otras cosas sobre estos mismos reingresos (En la creación de un campo nuevo en la tabla de tipo BOOLEAN para saber si es reingreso o no).

¿Saben si existe una forma de hacerlo pero con PHP? En la línea 6 del siguiente código intento evaluar el campo actual+1 pero eso que estoy inventando no funciona, solo es para expresar la idea.
PHP:
<?php
    $reingresos = 0;
    $sql="SELECT * FROM ingresos WHERE fecha_ingreso BETWEEN '2010-01-01' AND '2010-01-30' ORDER BY fecha_ingreso ASC;
    $result=pg_query($sql);
    while($row = pg_fetch_assoc($result)){
        $horas=date('H',strtotime($row[+1,'fechaIngreso'])-strtotime($row['fechaSalida']);
        if (ceil($horas)<25){
            $reingresos++;
        }
    }
    echo "Los reingresos del mes fueron: ".$reingresos;
?>
 
Lo probé en local pero no devuelve los datos acertadamente. Analizando la consulta veo que en con el WHERE
Código:
WHERE fechaSalida BETWEEN fechaIngreso AND DATE_ADD(fechaIngreso, INTERVAL 1 DAY)
Solo tendría en cuenta los registros en los que el cliente haya estado en el almacén por 1 día. Y la idea es obtener los clientes que hayan salido del almacén y regresado en las siguientes 24hs.



Lo intenté así pero no evalúa correctamente, es como si a pesar de que las tablas tienen alias distintos siempre evalúa sobre el mismo registro, es decir, siempre evalúa fechaIngreso de id=1 - fechaSalida de id=1 (No pasa al siguiente registro a pesar de agregarle el +1)

En general he intentado de muchas formas con SQL pero no he podido aunque las opciones que me han dado me sirven para otras cosas sobre estos mismos reingresos (En la creación de un campo nuevo en la tabla de tipo BOOLEAN para saber si es reingreso o no).

¿Saben si existe una forma de hacerlo pero con PHP? En la línea 6 del siguiente código intento evaluar el campo actual+1 pero eso que estoy inventando no funciona, solo es para expresar la idea.
PHP:
<?php
    $reingresos = 0;
    $sql="SELECT * FROM ingresos WHERE fecha_ingreso BETWEEN '2010-01-01' AND '2010-01-30' ORDER BY fecha_ingreso ASC;
    $result=pg_query($sql);
    while($row = pg_fetch_assoc($result)){
        $horas=date('H',strtotime($row[+1,'fechaIngreso'])-strtotime($row['fechaSalida']);
        if (ceil($horas)<25){
            $reingresos++;
        }
    }
    echo "Los reingresos del mes fueron: ".$reingresos;
?>

Dejo esto:
Código:
SELECT cedula, count(cedula)
FROM test AS a
where (fechaIngreso - (SELECT max(fechasalida)
    FROM   Test as b
    WHERE  b.fechaSalida < a.fechaIngreso
    and cedula = a.cedula
)) < INTERVAL '1 days'
group by cedula;

Revisar si funciona bien.....
 
una preguntilla, como hago para colocar el resultado de este codigo dentro de un div??
codigo
$fila= mysql_fetch_assoc($resultado);
echo $fila['codigou'];
la idea es darle estilo css al resultado de la consulta echa a mysql con php
 
hice esto y me pareció mas fácil.
echo '<div id="nombre">'.$fila['cliente'].'</div>';
pero muchas gracias por la pronta respuesta
 
!Hola a todos!
Para programar PHP en Ubuntu 14.04 LTS usando NetBeans ¿es necesario instalar Apache 2.2 y PHP desde consola o basta con instalar XAMPP?
Pregunto porque en Windows instalaba XAMPP, NetBeans y me funcionaba, pero en Ubuntu no tengo idea de cómo programar en PHP.
Lo otro que quiero saber es si necesito phpMyAdmin para conectar bases de datos creadas en MySQL.
En otras palabras, lo que quiero saber es qué tengo que instalar y qué no hace falta instalar para programar en PHP usando -eso sí- NetBeans.
¡Gracias!
 
si instalas XAMPP el te instala apache PHP MySql y con eso ya puedes empezar a trabajar, si quieres un IDE puedes utilizar NetBeans pero me parece muy pesado y si solo lo utilizaras para PHP y otros script puedes utilizar Notepad++ sin complicarte
 

Los últimos temas