Foros del Web » Programación para mayores de 30 ;) » Bases de Datos General » Mysql »

[SOLUCIONADO] Consulta complicada Fechas

Estas en el tema de Consulta complicada Fechas en el foro de Mysql en Foros del Web. Hola buenas la verdad es que estoy un poco perdido, haber si me podéis ayudar, tengo una serie de registros en una tabla, en la ...
  #1 (permalink)  
Antiguo 09/02/2015, 05:02
Avatar de alexmetola  
Fecha de Ingreso: julio-2013
Ubicación: madrid
Mensajes: 33
Antigüedad: 10 años, 9 meses
Puntos: 0
Pregunta Consulta complicada Fechas

Hola buenas la verdad es que estoy un poco perdido, haber si me podéis ayudar, tengo una serie de registros en una tabla, en la tabla hay 4 campos Id,StartTime,EndTime,asigned.

Código HTML:
Id      Asigned    StartTime                        EndTime
1752      27        2015-02-09 06:30:00      2015-02-09 08:15:00
1753      28        2015-02-09 06:00:00      2015-02-09 08:30:00
1754      29        2015-02-09 06:15:00      2015-02-09 08:30:00
1755      27        2015-02-09 06:00:00      2015-02-09 07:00:00
Quiero sacar solo aquellos registros en los que el campo asigned sea el mismo y la fecha de inicio de uno de los registros este entre la fecha de inicio y la fecha de fin de otro de ellos.

Osea en este caso me debería sacar el registro 1752,pero claro cuando haya muchos mas debería sacarlo.
PJ: si ademas hay:
Código HTML:
Id      Asigned    StartTime                        EndTime
1756      27        2015-02-09 06:40:00      2015-02-09 12:15:00
La consulta me debería sacar 1752 y 1756.

No se si realizar una vista o un procedimiento o una consulta muy compleja, a ver si podéis ayudarme.
Cualquier respuesta es bienvenida.

Gracias.
Saludos.

Última edición por alexmetola; 09/02/2015 a las 05:08
  #2 (permalink)  
Antiguo 09/02/2015, 05:09
 
Fecha de Ingreso: mayo-2013
Mensajes: 171
Antigüedad: 10 años, 11 meses
Puntos: 4
Respuesta: Consulta complicada Fechas

¿Que codigo usas?
Por ejemplo para que, segun lo que explicas, te de el registro 1752, que es exactamente lo que haces?
  #3 (permalink)  
Antiguo 09/02/2015, 05:23
Avatar de alexmetola  
Fecha de Ingreso: julio-2013
Ubicación: madrid
Mensajes: 33
Antigüedad: 10 años, 9 meses
Puntos: 0
Respuesta: Consulta complicada Fechas

No se como sacar esta consulta en mysql , osea yo se que es el registro 1752 por que se ve en la tabla, miro todos aquellos registros que su asigned sea el mismo y los comparo entre ellos, como en este caso solo hay dos registros compara estos 2 osea el 1752 y el 1755 ahora miro si existe alguno de esos dos registros cuya fecha de inicio sea mayor o igual que la fecha de inicio del otro registro y que ademas la fecha de inicio sea menor o igual que la fecha de fin del otro registro , en este caso se ve que el 1752 tiene una fecha de inicio entre la fecha de inicio y la de fin del 1755.

Me he explicado bien?.
Saludos.
  #4 (permalink)  
Antiguo 09/02/2015, 09:35
Avatar de David_Carrera_G  
Fecha de Ingreso: noviembre-2014
Ubicación: Santiago
Mensajes: 37
Antigüedad: 9 años, 5 meses
Puntos: 1
Respuesta: Consulta complicada Fechas

Yo creo que deberías, explicar de mejor forma que quieres realizar y el porque de ello, también quizás la estructuras de tus tablas y un posible resultado de las query. Saludos
__________________
David Carrera González
Santiago de Chile
Analista de base de datos
  #5 (permalink)  
Antiguo 09/02/2015, 13:51
Avatar de alexmetola  
Fecha de Ingreso: julio-2013
Ubicación: madrid
Mensajes: 33
Antigüedad: 10 años, 9 meses
Puntos: 0
Respuesta: Consulta complicada Fechas

A ver, necesito saber los registros que estén solapados entre ellos, se que es una consulta difícil y mas aun explicándolo por aquí:

Código MySQL:
Ver original
  1. CREATE TABLE IF NOT EXISTS `MyTable` (
  2.   `Id` int(11) NOT NULL AUTO_INCREMENT,
  3.   `Asigned` varchar(200) CHARACTER SET utf8 DEFAULT NULL,
  4.   `StartTime` datetime DEFAULT NULL,
  5.   `EndTime` datetime DEFAULT NULL,
  6.   PRIMARY KEY (`Id`)
  7.  
  8. INSERT INTO `MyTable` (`Id`, `Asigned`, `StartTime`, `EndTime`) VALUES
  9. (1, '200', '2014-12-24 06:00:00', '2014-12-24 13:30:00'),
  10. (2, '200', '2014-12-24 07:00:00', '2014-12-24 08:00:00'),
  11. (3, '100', '2014-12-25 06:00:00', '2014-12-25 08:30:00'),
  12. (4, '100', '2014-12-25 07:00:00', '2014-12-25 08:00:00'),
  13. (5, '100', '2014-12-25 07:00:00', '2014-12-25 07:30:00'),
  14. (6, '200', '2014-12-25 06:00:00', '2014-12-25 08:30:00'),
  15. (7, '300', '2014-12-25 06:00:00', '2014-12-25 16:00:00'),
  16. (8, '400', '2014-12-25 06:00:00', '2014-12-25 08:41:00'),
  17. (9, '300', '2014-12-25 17:00:00', '2014-12-25 20:30:00'),
  18. (10, '100', '2014-12-30 06:00:00', '2014-12-30 08:30:00');

Por ejemplo tenemos estos 10 registros y yo quiero saber los solapados cuyo asigned sea el mismo:
-Miro los asigned del 100, que son el 3,4,5,10 y veo cual de ellos tiene la fecha de inicio entre la fecha de inicio y fin del otro, en este caso los solapados son el 4 y 5 ya que su fecha de inicio empieza a las 7:00 esta entre la fecha del registro 3 que es de las 6:00-8:30.
-Miro los asigned del 200 que son el 1,2,6 y veo que el solapado es el 2 pues su fecha de inicio que es a las 7:00 esta entre las fechas del registro 1 que son de las 6:00-13:30.
-Miro los asigned del 300 que son el 7,9 y veo que no hay solapados.
-Miro los asigned del 400 que son el 8 y veo que no hay solapados.

Para mi aquellos registros que digo solapados son los que tienen su fecha de inicio entre la fecha de inicio y fin de otro de los registros.

Necesito sacar una consulta, que me saque los registros que necesito que en este caso serian el 2,4,5.
-Supongo que mediante cursores comparando uno a uno todos los registros puedo sacar mis resultados, pero no se si realmente es lo mas óptimo o no.

Saludos y gracias.

Última edición por alexmetola; 09/02/2015 a las 14:00
  #6 (permalink)  
Antiguo 10/02/2015, 02:13
Avatar de alexmetola  
Fecha de Ingreso: julio-2013
Ubicación: madrid
Mensajes: 33
Antigüedad: 10 años, 9 meses
Puntos: 0
Respuesta: Consulta complicada Fechas

Bueno al final he decidido por hacer un procedimiento con 2 cursores analizando asi todas las combinaciones, igualmente si hay alguna forma de hacerlo mejor decirmelo.

Os dejo el codigo que he realizado:

Código MySQL:
Ver original
  1. -- --------------------------------------------------------------------------------
  2. -- Routine DDL
  3. -- Note: comments before and after the routine body will not be stored by the server
  4. -- --------------------------------------------------------------------------------
  5. DELIMITER $$
  6.  
  7. CREATE DEFINER=`root`@`localhost` PROCEDURE `CheckRed`()
  8.  
  9.  
  10.   DECLARE done,done2 INT DEFAULT FALSE;
  11.   DECLARE Asignedc,Asigned2c int;
  12.   DECLARE IdComp varchar(500);
  13.    
  14.   DECLARE StartTimec,StartTime2c datetime;
  15.   DECLARE EndTimec,EndTime2c datetime;
  16.   DECLARE Idc,Id2c INT;
  17.   DECLARE cur1 CURSOR FOR SELECT Id,Asigned,StartTime,EndTime  FROM Prueba.MyTable;
  18.   DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE;
  19.     CREATE TEMPORARY TABLE IF NOT exists temp1 ( Id int);
  20.   OPEN cur1;
  21. SET IdComp = '0';
  22.  
  23.   read_loop: LOOP
  24.     FETCH cur1 INTO Idc,Asignedc,StartTimec,EndTimec;
  25.    IF done THEN
  26.       LEAVE read_loop;
  27.     END IF;
  28. If Idc not in (IdComp) then
  29.             BLOCK2: BEGIN
  30.                     DECLARE cur2 CURSOR FOR SELECT Id,Asigned,StartTime,EndTime FROM Prueba.MyTable where Asigned=Asignedc
  31.                             and Id!=Idc and StartTimec<=StartTime and EndTimec>=StartTime and Id not in (IdComp);
  32.                     DECLARE CONTINUE HANDLER FOR NOT FOUND SET done2 = TRUE;
  33.                     OPEN cur2;
  34.                     read_loop2: LOOP
  35.                     FETCH FROM cur2 INTO Id2c,Asigned2c,StartTime2c,EndTime2c;  
  36.                         IF done2 THEN
  37.                         set done2 = false;
  38.                         CLOSE cur2;
  39.                         LEAVE read_loop2;
  40.                         END IF;
  41.                         INSERT INTO temp1 VALUES (Id2c);
  42.                        
  43.                         SET IdComp = CONCAT(Id2c,',', IdComp);
  44.                        
  45.                     END LOOP read_loop2;
  46.             END BLOCK2;
  47.   END LOOP;
  48.   CLOSE cur1;
  49. select * from temp1;
  50. drop table temp1;

Saludos y gracias por todo.

Etiquetas: campo, fecha, registro, tabla
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 13:03.