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

Error en función MySql

Estas en el tema de Error en función MySql en el foro de Mysql en Foros del Web. Hola, tengo una función que se supone que calcula la mayor diferencia entre dos fechas de registros consecutivos, es decir, compara la fecha del registro ...
  #1 (permalink)  
Antiguo 13/07/2016, 04:50
 
Fecha de Ingreso: enero-2012
Mensajes: 52
Antigüedad: 12 años, 1 mes
Puntos: 1
Pregunta Error en función MySql

Hola, tengo una función que se supone que calcula la mayor diferencia entre dos fechas de registros consecutivos, es decir, compara la fecha del registro 2 con la del 1, 3 con 2, 4 con 3, etc. El código es:
Código MySQL:
Ver original
  1. CREATE DEFINER=`root`@`localhost` FUNCTION `dias_sin`() RETURNS smallint(6)
  2.  
  3. declare contador integer default 14;
  4. declare time_min date;
  5. declare time_max date;
  6. declare resultado smallint default 0;
  7.  
  8. SELECT MAX(salida_num)INTO ultimo FROM datos;
  9.  
  10. while contador < ultimo+1 do
  11.  
  12.     SELECT fecha INTO time_min FROM datos WHERE salida_num = contador;
  13.     SELECT fecha INTO time_max FROM datos WHERE salida_num = contador + 1;
  14.         SELECT DATEDIFF(time_max,time_min) INTO dif;
  15.     set resta = cast(dif as unsigned);
  16.    
  17.     if resultado < resta then
  18.    
  19.         set resultado = resta;
  20.        
  21.     end if;
  22.    
  23.     set contador = contador+1;
  24.    
  25. end while;
  26.  
  27. RETURN resultado;
  28.  
El problema es que devuelve 0 y no sé porqué. ¿Alguien me puede echar una mano? Gracias.

Última edición por gnzsoloyo; 13/07/2016 a las 08:01
  #2 (permalink)  
Antiguo 13/07/2016, 07:29
Avatar de Libras
Colaborador
 
Fecha de Ingreso: agosto-2006
Ubicación: En la hermosa perla de occidente
Mensajes: 7.412
Antigüedad: 17 años, 7 meses
Puntos: 774
Respuesta: Error en función MySql

a lo que veo nunca estas usando los valores resta ni resultado, siempre son 0, revisa la logica de tu proceso
__________________
What does an execution plan say to t-sql query? Go f**k yourself, if you are not happy with me
  #3 (permalink)  
Antiguo 13/07/2016, 08:08
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 4 meses
Puntos: 2658
Respuesta: Error en función MySql

Cita:
Iniciado por solilopi Ver Mensaje
Hola, tengo una función que se supone que calcula la mayor diferencia entre dos fechas de registros consecutivos, es decir, compara la fecha del registro 2 con la del 1, 3 con 2, 4 con 3, etc. .
Mas alla de crear o no una SF, lo que quieres hacer es algo como:

Código MySQL:
Ver original
  1. SELECT MIN(DATEDIFF(dt2.fecha, dt1.fecha)) minimo
  2. FROM datos dt1
  3.    INNER JOIN datos 2t2 ON dt1.salida_num = dt2.salida_num+1;

Nota: Estoy reconstruyendo de memoria algo que hice hace años, no aseguro que funcione de entrada porque no tengo tus datos para probarlo.
Ahora bien, ten muy presente que el mínimo puede devolverte cero si hay dos registros que tengan la misma fecha...
¿Esto lo tuviste en cuenta?
Para excluir esos casos debería ser:
Código MySQL:
Ver original
  1. SELECT MIN(DATEDIFF(dt2.fecha, dt1.fecha)) minimo
  2. FROM datos dt1
  3.    INNER JOIN datos 2t2 ON dt1.salida_num = dt2.salida_num+1
  4. WHERE dt2.fecha > dt1.fecha ;
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #4 (permalink)  
Antiguo 13/07/2016, 10:24
 
Fecha de Ingreso: enero-2012
Mensajes: 52
Antigüedad: 12 años, 1 mes
Puntos: 1
Respuesta: Error en función MySql

Hola libras, resta es el resultado de convertir a entero dif, SELECT DATEDIFF(time_max,time_min) INTO dif;
resultado tomará el valor de resta siempre que éste sea > 0
  #5 (permalink)  
Antiguo 13/07/2016, 10:27
Avatar de Libras
Colaborador
 
Fecha de Ingreso: agosto-2006
Ubicación: En la hermosa perla de occidente
Mensajes: 7.412
Antigüedad: 17 años, 7 meses
Puntos: 774
Respuesta: Error en función MySql

Cita:
Iniciado por solilopi Ver Mensaje
Hola libras, resta es el resultado de convertir a entero dif, SELECT DATEDIFF(time_max,time_min) INTO dif;
resultado tomará el valor de resta siempre que éste sea > 0
Sintaxis de mysql, muy diferente a la de SQL server :S
__________________
What does an execution plan say to t-sql query? Go f**k yourself, if you are not happy with me
  #6 (permalink)  
Antiguo 13/07/2016, 11:25
 
Fecha de Ingreso: enero-2012
Mensajes: 52
Antigüedad: 12 años, 1 mes
Puntos: 1
Pregunta Respuesta: Error en función MySql

hola gnzsoloyo, me ha parecido buena idea tu solución y la he adaptado a mi función con resultado idéntico: 0
Código MySQL:
Ver original
  1. CREATE DEFINER=`root`@`localhost` FUNCTION `dias_sin`() RETURNS smallint(6)
  2.  
  3. declare contador integer default 14;
  4. declare resultado smallint default 0;
  5.  
  6. SELECT MAX(salida_num)INTO ultimo FROM datos;
  7.  
  8.      
  9.      SELECT MAX(DATEDIFF((select fecha from datos where salida_num = contador),
  10.      (select fecha from datos where salida_num = contador + 1))) into dif FROM datos;
  11.      
  12.     if resultado < cast(dif as unsigned) then
  13.    
  14.         set resultado = cast(dif as unsigned);
  15.        
  16.     end if;
  17.    
  18.     set contador = contador+1;
  19.        
  20.     until contador = ultimo
  21.    
  22.     end repeat;
  23.    
  24. RETURN resultado;
  25.  
¿Cual es el error?, pues si hago:
Código MySQL:
Ver original
  1. SELECT MAX(DATEDIFF((select fecha from datos where salida_num = 25),
  2.      (select fecha from datos where salida_num = 24))) into dif FROM datos;
en una consulta normal a la Bd, sí lo hace bien. No lo entiendo!!!!

Última edición por gnzsoloyo; 13/07/2016 a las 11:30
  #7 (permalink)  
Antiguo 13/07/2016, 11:32
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 4 meses
Puntos: 2658
Respuesta: Error en función MySql

Empecemos por el principio:
¿Hiciste la prueba primero con la query tal y como te la propuse, sin modificarla? ¿Devolvió algo?

Es decir, sólo así:
Código MySQL:
Ver original
  1. SELECT MIN(DATEDIFF(dt2.fecha, dt1.fecha)) minimo
  2. FROM datos dt1
  3.    INNER JOIN datos 2t2 ON dt1.salida_num = dt2.salida_num+1
  4. WHERE dt2.fecha > dt1.fecha ;
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #8 (permalink)  
Antiguo 13/07/2016, 11:45
 
Fecha de Ingreso: enero-2012
Mensajes: 52
Antigüedad: 12 años, 1 mes
Puntos: 1
Pregunta Respuesta: Error en función MySql

Hola, no, la hice así:
Código:
SELECT MAX(DATEDIFF((select fecha from datos where salida_num = 95),
     (select fecha from datos where salida_num = 94))) FROM datos;
Lo del 95 y 94 son valores del índice, podrían haber sido cualesquiera consecutivos.
Así, probado en una consulta SQL a la Bd no hay problema, el problema está al meterlo en la función.
  #9 (permalink)  
Antiguo 13/07/2016, 11:47
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 4 meses
Puntos: 2658
Respuesta: Error en función MySql

No me interesa como la hiciste, necesito que la pruebes tal y como está.
La adaptacion que estás haciendo no es ni eficiente ni correcta.

Haz la prueba y dime qué devuelve.

Luego te muestro cómo meter eso en la SF que estás creando, porque lo que haces es complicarte la vida.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #10 (permalink)  
Antiguo 13/07/2016, 11:51
Avatar de Libras
Colaborador
 
Fecha de Ingreso: agosto-2006
Ubicación: En la hermosa perla de occidente
Mensajes: 7.412
Antigüedad: 17 años, 7 meses
Puntos: 774
Respuesta: Error en función MySql

Esta pensando como desarrollador de manera secuencial y no como se piensa en una base de datos en un dataset ;)
__________________
What does an execution plan say to t-sql query? Go f**k yourself, if you are not happy with me
  #11 (permalink)  
Antiguo 13/07/2016, 12:09
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 4 meses
Puntos: 2658
Respuesta: Error en función MySql

Seguro, está pensando como programador, y eso no está bien.

Bueno, ejemplificando, lo que quisiera que haga es esto:
Código MySQL:
Ver original
  1. mysql> CREATE TABLE datos (
  2.     ->     salida_num INT UNSIGNED PRIMARY KEY,
  3.     ->     fecha DATE
  4.     -> );
  5. Query OK, 0 rows affected (0.08 sec)
  6.  
  7. mysql> insert into datos
  8.     -> values
  9.     -> (1, str_to_date('20/01/2016', '%d/%m/%Y')),
  10.     -> (2, str_to_date('25/01/2016', '%d/%m/%Y')),
  11.     -> (3, str_to_date('01/03/2016', '%d/%m/%Y')),
  12.     ->  (4, str_to_date('02/03/2016', '%d/%m/%Y')),
  13.     ->  (5, str_to_date('03/03/2016', '%d/%m/%Y')),
  14.     ->  (6, str_to_date('04/03/2016', '%d/%m/%Y')),
  15.     ->  (7, str_to_date('05/03/2016', '%d/%m/%Y')),
  16.     ->  (8, str_to_date('05/03/2016', '%d/%m/%Y')),
  17.     ->  (9, str_to_date('05/03/2016', '%d/%m/%Y')),
  18.     ->  (10, str_to_date('05/03/2016', '%d/%m/%Y')),
  19.     ->  (11, str_to_date('06/03/2016', '%d/%m/%Y')),
  20.     ->  (12, str_to_date('07/03/2016', '%d/%m/%Y')),
  21.     ->  (13, str_to_date('08/03/2016', '%d/%m/%Y')),
  22.     ->  (14, str_to_date('09/04/2016', '%d/%m/%Y')),
  23.     ->  (15, str_to_date('10/04/2016', '%d/%m/%Y')),
  24.     ->  (16, str_to_date('11/04/2016', '%d/%m/%Y')),
  25.     ->  (17, str_to_date('01/05/2016', '%d/%m/%Y')),
  26.     ->  (18, str_to_date('02/05/2016', '%d/%m/%Y')),
  27.     ->  (19, str_to_date('03/05/2016', '%d/%m/%Y')),
  28.     ->  (20, str_to_date('04/05/2016', '%d/%m/%Y'));
  29. Query OK, 20 rows affected (0.02 sec)
  30. Records: 20  Duplicates: 0  Warnings: 0
  31.  
  32. mysql>
  33. mysql>  SELECT
  34.     ->     MIN(DATEDIFF(dt1.fecha, dt2.fecha)) minimo
  35.     -> FROM
  36.     ->     datos dt1
  37.     ->         INNER JOIN
  38.     ->     datos dt2 ON dt1.salida_num = dt2.salida_num + 1;
  39. +--------+
  40. | minimo |
  41. +--------+
  42. |      0 |
  43. +--------+
  44. 1 row in set (0.00 sec)

Donde si quiero la mayor diferencia entre dos fechas, sería:
Código MySQL:
Ver original
  1. mysql>  SELECT
  2.     ->     MAX(DATEDIFF(dt1.fecha, dt2.fecha)) maximo
  3.     -> FROM
  4.     ->     datos dt1
  5.     ->         INNER JOIN
  6.     ->     datos dt2 ON dt1.salida_num = dt2.salida_num + 1;
  7. +--------+
  8. | maximo |
  9. +--------+
  10. |     36 |
  11. +--------+
  12. 1 row in set (0.00 sec)

Claro que para que esta lógica funcione, no tiene que haber saltos en la numeración de la PK... dado que si los hay no devolverá datos allí.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #12 (permalink)  
Antiguo 13/07/2016, 13:20
 
Fecha de Ingreso: enero-2012
Mensajes: 52
Antigüedad: 12 años, 1 mes
Puntos: 1
Respuesta: Error en función MySql

Hola de nuevo, sí funciona
Código:
SELECT MAX(DATEDIFF(dt1.fecha, dt2.fecha)) maximo FROM datos dt1 INNER JOIN datos dt2 ON dt1.salida_num = dt2.salida_num + 1
Voy a intentar introducirlo en mi función. Ya te digo algo.
  #13 (permalink)  
Antiguo 13/07/2016, 13:31
 
Fecha de Ingreso: enero-2012
Mensajes: 52
Antigüedad: 12 años, 1 mes
Puntos: 1
Pregunta Respuesta: Error en función MySql

Hola, ya lo he implementado en la función y sigue devolviendo 0. La función queda:
Código MySQL:
Ver original
  1. CREATE DEFINER=`root`@`localhost` FUNCTION `dias_sin`() RETURNS smallint(6)
  2.  
  3. declare contador integer;
  4. declare resultado smallint default 0;
  5.  
  6. SELECT MAX(salida_num)INTO ultimo FROM datos;
  7.  
  8. set contador = 14;
  9.  
  10. repeat       
  11.      
  12.      SELECT MAX(DATEDIFF(dt1.fecha, dt2.fecha)) into dif FROM datos dt1
  13.      INNER JOIN datos dt2 ON dt1.salida_num = dt2.salida_num + 1;
  14.      
  15.     if resultado < cast(dif as unsigned) then
  16.    
  17.         set resultado = cast(dif as unsigned);
  18.        
  19.     end if;
  20.    
  21.     set contador = contador+1;
  22.        
  23.     until contador = ultimo
  24.    
  25.     end repeat;
  26.    
  27. RETURN resultado;
  28.  
La tabla datos es:
Código MySQL:
Ver original
  1. CREATE TABLE `datos` (
  2.   `salida_num` int(10) unsigned NOT NULL AUTO_INCREMENT,
  3.   `recorrido` varchar(50) COLLATE utf8_spanish2_ci NOT NULL,
  4.   `tiempo` varchar(8) COLLATE utf8_spanish2_ci NOT NULL,
  5.   `distancia` decimal(5,2) NOT NULL,
  6.   `calorias` decimal(6,2) NOT NULL,
  7.   `kmh` decimal(4,2) NOT NULL,
  8.   `fecha` date NOT NULL,
  9.   PRIMARY KEY (`salida_num`)
  10. ) ENGINE=InnoDB AUTO_INCREMENT=133 DEFAULT CHARSET=utf8 COLLATE=utf8_spanish2_ci;
el insert es:
Código MySQL:
Ver original
  1. INSERT INTO `datos` VALUES (1,'Casa-Blayet','01:47:22',36.37,855.30,20.32,'2013-01-01'),(2,'Casa-El Perelló','02:10:03',44.76,1036.00,20.65,'2013-01-01'),(3,'Casa-El Perelló','02:08:15',44.76,1021.67,20.94,'2013-01-01'),(4,'Casa-El Perelló','02:04:07',44.76,988.74,21.64,'2013-01-01'),(5,'Casa-El Recatí','01:50:53',39.81,883.32,21.54,'2013-01-01'),(6,'Casa-Barraca','02:15:48',49.78,1081.81,21.99,'2013-01-01'),(7,'Casa-Barraca','02:10:38',49.78,1250.74,22.86,'2013-01-01'),(8,'Casa-Blayet','01:33:23',36.37,894.09,23.37,'2013-01-01'),(9,'Casa-Blayet','01:32:25',36.37,884.83,23.61,'2013-01-01'),(10,'Casa-Blayet','01:37:09',36.37,773.92,22.46,'2013-01-01'),(11,'Casa-Barraca','02:06:12',49.78,1208.29,23.67,'2013-01-01'),(12,'Casa-Blayet','01:42:28',36.51,845.08,21.38,'2013-01-01'),(13,'Casa-El Perelló','01:54:49',45.44,1138.10,23.75,'2013-01-01'),(14,'Casa-Blayet','01:30:59',36.51,988.00,24.10,'2013-05-24'),(15,'Casa-Blayet','01:33:10',36.93,923.00,23.80,'2013-05-25'),(16,'Casa-Barraca','02:02:25',49.48,1329.00,24.30,'2013-06-15'),(17,'Casa-Blayet','01:29:08',35.89,1212.00,24.30,'2013-06-17'),(18,'Casa-Blayet','01:31:17',36.70,991.00,24.20,'2013-06-20'),(19,'Casa-Barraca','02:03:16',49.59,1338.00,24.20,'2013-06-29'),(20,'Casa-Barraca','01:59:56',49.57,1302.00,24.80,'2013-07-05'),(21,'Casa-Blayet','01:26:11',36.03,936.00,25.22,'2013-07-08'),(22,'Casa-Blayet','01:27:05',36.98,945.00,25.50,'2013-07-17'),(23,'Casa-Barraca','01:56:28',49.19,1236.00,25.50,'2013-07-22'),(24,'Casa-Blayet','01:28:29',36.17,939.00,24.70,'2013-07-23'),(25,'Casa-Blayet','01:33:20',36.39,904.00,23.50,'2013-07-25'),(26,'Casa-Barraca','01:56:44',49.25,1239.00,25.40,'2013-07-29'),(27,'Casa-Blayet','01:28:16',36.33,936.00,24.80,'2013-07-30'),(28,'Casa-Blayet','01:43:15',36.76,832.00,21.40,'2013-08-01'),(29,'Casa-Blayet','01:26:59',36.64,923.00,25.40,'2013-08-02'),(30,'Casa-Blayet','01:25:26',36.03,906.00,25.40,'2013-08-05'),(31,'Casa-Blayet','01:24:07',36.05,978.00,25.71,'2013-08-24'),(32,'Casa-Blayet','01:26:41',36.00,920.00,25.00,'2013-08-31'),(33,'Casa-Blayet','01:38:52',36.56,796.00,22.20,'2013-09-13'),(34,'Casa-Blayet','01:26:09',35.93,914.00,25.02,'2013-09-21'),(35,'Casa-Blayet','01:32:27',36.59,915.00,23.40,'2013-10-05'),(36,'Casa-Barraca','01:59:38',49.65,1269.00,25.00,'2013-10-19'),(37,'Casa-Barraca','02:01:06',49.32,1285.00,24.50,'2013-10-21'),(38,'Casa-Blayet','01:26:43',35.93,920.00,25.00,'2013-10-28'),(39,'Casa-Blayet','01:34:05',36.48,911.00,23.40,'2013-12-06'),(40,'Casa-Barraca(Castellar)','02:16:24',51.44,1275.00,22.63,'2014-01-11'),(41,'Casa-Blayet','01:34:08',36.13,880.00,23.10,'2014-03-17'),(42,'Casa-Blayet','01:34:12',36.18,880.00,23.20,'2014-03-18'),(43,'Casa-Barraca','01:56:12',49.28,1190.00,25.50,'2014-04-18'),(44,'Casa-Barraca','01:56:46',49.51,1196.00,25.50,'2014-04-21'),(45,'Casa-Barraca','02:01:02',49.73,1239.00,24.80,'2014-04-28'),(46,'Casa-Barraca','01:59:21',49.78,1222.00,25.03,'2014-04-30'),(47,'Casa-Barraca','02:03:59',49.74,1270.00,24.20,'2014-05-03'),(48,'Casa-Barraca','02:00:58',49.85,1239.00,23.50,'2014-05-10'),(49,'Casa-Blayet','01:28:50',36.08,909.00,24.50,'2014-05-23'),(50,'Casa-Sueca-Silla','02:48:14',61.88,1308.00,21.80,'2014-05-24'),(51,'Casa-Venta Cabrera-Picassent','02:01:18',41.65,943.00,20.70,'2014-06-01'),(52,'Casa-Barraca','02:02:23',49.58,1253.00,24.31,'2014-06-28'),(53,'Casa-Cullera','02:30:02',63.23,1536.00,25.40,'2014-07-05'),(54,'Casa-Blayet','01:27:59',36.01,901.00,24.70,'2014-07-09'),(55,'Casa-Barraca','01:55:18',49.11,1294.00,25.70,'2014-07-14'),(56,'Casa-Barraca','02:00:30',49.65,1234.00,24.80,'2014-07-16'),(57,'Casa-Barraca','01:59:18',49.13,1222.00,24.80,'2014-07-23'),(58,'Casa-Cullera','02:23:15',62.97,1608.00,26.50,'2014-07-26'),(59,'Casa-Cullera','02:38:37',62.85,1482.00,23.80,'2014-08-07'),(60,'Casa-Barraca','02:00:47',49.11,1237.28,24.40,'2014-08-08'),(61,'Casa-Barraca','01:55:36',49.15,1298.18,25.51,'2014-08-11'),(62,'Casa-Barraca','01:56:37',48.87,1194.61,25.14,'2014-09-13'),(63,'Casa-Barraca','01:57:11',49.11,1200.00,24.50,'2014-08-08'),(64,'Casa-Barraca','01:53:58',49.50,1279.00,25.50,'2014-08-11'),(65,'Casa-Cullera','02:30:34',62.75,1542.00,25.00,'2014-09-13'),(66,'Casa-Puzzle','01:55:03',45.74,1075.00,22.90,'2014-09-17'),(67,'Casa-Cullera','02:28:02',62.88,1516.00,25.50,'2014-09-20'),(68,'Casa-Barraca','01:58:50',49.10,1217.00,24.80,'2014-09-25'),(69,'Casa-Barraca','02:00:48',49.48,1237.00,24.20,'2014-10-02'),(70,'Casa-Barraca','02:02:23',49.02,1283.00,24.00,'2014-10-04'),(71,'Casa-Barraca','02:02:46',49.16,1287.00,24.00,'2014-10-09'),(72,'Casa-Cullera','02:34:50',62.13,1624.00,24.20,'2014-10-11'),(73,'Casa-Cullera-Sueca (El Romani)','02:50:25',70.35,1787.00,24.80,'2014-10-18'),(74,'Casa-Barraca','01:56:53',49.14,1785.00,24.80,'2014-10-26'),(75,'Casa-Cullera','02:30:33',62.75,1579.00,25.00,'2014-11-01'),(76,'Casa-Cullera','02:53:34',63.49,2410.00,21.30,'2014-11-15'),(77,'Casa-Cullera','02:38:56',62.92,1521.00,23.80,'2014-11-22'),(78,'Casa-Barraca','02:07:23',49.58,1219.62,23.35,'2014-12-06'),(79,'Casa-Barraca','02:02:32',49.14,1285.46,24.06,'2014-12-22'),(80,'Casa-Blayet','01:35:54',36.08,918.18,22.60,'2014-12-23'),(81,'Casa-Barraca','02:03:31',49.43,1295.78,24.01,'2015-02-28'),(82,'Casa-Barraca','02:08:36',49.13,1231.27,22.92,'2015-03-07'),(83,'Casa-Barraca','02:10:22',49.21,1248.19,22.65,'2015-04-03'),(84,'Casa-Cullera','02:47:08',63.32,1600.20,22.73,'2015-04-09'),(85,'Casa-Cullera','02:43:45',62.94,1567.81,23.06,'2015-04-11'),(86,'Casa-Cullera','02:37:32',63.38,1652.63,24.14,'2015-04-18'),(87,'Casa-Cullera','02:43:09',63.23,1562.06,23.25,'2015-04-25'),(88,'Casa-Barraca','02:14:42',49.16,1073.05,21.90,'2015-05-01'),(89,'Casa-Cullera','02:37:38',62.87,1509.24,23.93,'2015-05-09'),(90,'Casa-Cullera','02:41:14',62.29,1543.71,23.18,'2015-05-16'),(91,'Casa-Cullera','02:32:36',62.80,1639.00,24.80,'2015-05-23'),(92,'Casa-Cullera','02:34:48',62.49,1623.96,24.22,'2015-05-30'),(93,'Casa-Barraca','02:08:35',49.24,1231.11,22.98,'2015-06-02'),(94,'Casa-Barraca','02:07:24',49.17,1219.78,23.16,'2015-06-04'),(95,'Casa-Cullera','02:41:42',62.88,1493.54,23.33,'2015-06-06'),(96,'Casa-Barraca','02:05:22',49.23,1157.95,23.56,'2015-06-09'),(97,'Casa-Cullera','02:34:57',63.48,1568.16,24.58,'2015-06-20'),(98,'Casa-Barraca','02:12:13',49.37,1016.09,22.40,'2015-06-23'),(99,'Casa-Barraca','02:00:59',49.38,1224.40,24.49,'2015-06-30'),(100,'Casa-Cullera','02:37:46',62.79,1457.21,23.88,'2015-07-04'),(101,'Casa-Cullera','02:25:09',62.77,1610.38,25.95,'2015-07-12'),(102,'Casa-Barraca','01:59:54',49.07,1213.44,24.56,'2015-07-16'),(103,'Casa-Cullera','02:27:42',62.76,1476.56,25.49,'2015-07-25'),(104,'Casa-Cullera','02:31:43',62.75,1479.27,24.82,'2015-08-02'),(105,'Casa-Cullera','02:30:17',62.73,1465.29,25.04,'2015-08-10'),(106,'Casa-Barraca','02:06:09',49.16,1122.55,23.38,'2015-08-11'),(107,'Casa-Barraca','02:11:19',49.39,1168.53,22.57,'2015-08-13'),(108,'Casa-Cullera','02:30:00',62.73,1462.53,25.09,'2015-08-17'),(109,'Casa-Cullera','02:32:11',62.59,1483.81,24.68,'2015-08-22'),(110,'Casa-Cullera','02:33:06',62.74,1492.75,24.59,'2015-08-29'),(111,'Casa-Cullera','02:33:06',62.67,1511.65,24.56,'2015-09-05'),(112,'Casa-Cullera-Sueca','03:02:32',73.14,1802.26,24.04,'2015-09-12'),(113,'Casa-Cullera','02:29:42',62.74,1478.08,25.15,'2015-09-20'),(114,'Casa-Mareny Blau','02:21:34',56.10,1275.69,23.78,'2015-10-03'),(115,'Casa-Cullera','02:36:59',62.78,1414.61,23.99,'2015-10-17'),(116,'Casa-Cullera','02:37:26',62.76,1418.66,23.92,'2015-11-09'),(117,'Casa-Cullera','02:36:00',62.78,1540.28,24.15,'2015-11-14'),(118,'Casa-Barraca','02:11:35',48.93,986.56,22.31,'2015-11-28'),(119,'Casa-Barraca','02:05:24',49.19,1158.25,23.54,'2016-01-23'),(120,'Casa-Barraca','02:05:17',49.81,1157.17,23.85,'2016-01-30'),(121,'Casa-Barraca','02:02:56',49.14,1135.47,23.98,'2016-02-06'),(122,'Casa-Cullera','02:37:38',63.50,1595.32,24.17,'2016-03-26'),(123,'Casa-Barraca','02:23:21',49.90,1101.65,20.89,'2016-04-02'),(124,'Casa-Barraca','02:03:26',49.43,1249.20,24.03,'2016-05-01'),(125,'Casa-Cullera(Castellar)','02:30:40',65.55,1671.59,26.10,'2016-05-07'),(126,'Casa-Barraca','02:08:34',49.37,1187.51,23.04,'2016-05-21'),(127,'Casa-Barraca','02:10:47',49.36,1207.97,22.65,'2016-06-04'),(128,'Casa-Barraca','02:07:34',49.55,1778.00,23.31,'2016-06-07'),(129,'Casa-Barraca','02:11:40',49.86,1834.00,22.72,'2016-06-09'),(130,'Casa-Barraca','02:13:40',49.82,1862.00,22.36,'2016-06-11'),(131,'Casa-Cullera','02:34:03',63.47,2228.00,24.72,'2016-06-25'),(132,'Casa-Cullera','02:35:40',63.44,2132.00,24.44,'2016-07-02');
Creo que con esto ya puedes tener mejor idea de lo que tengo, ya te digo, al ejecutar la función devuelve 0

Última edición por gnzsoloyo; 13/07/2016 a las 15:30
  #14 (permalink)  
Antiguo 13/07/2016, 15:46
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 4 meses
Puntos: 2658
Respuesta: Error en función MySql

Mira, con la query que te indiqué, tu stored function se reduce a esto:
Código MySQL:
Ver original
  1.  
  2. DECLARE resultado SMALLINT DEFAULT 0;
  3.  
  4.   SELECT
  5.     MAX(DATEDIFF(dt1.fecha, dt2.fecha))
  6. INTO resultado FROM
  7.     datos dt1
  8.         INNER JOIN
  9.     datos dt2 ON dt1.salida_num = dt2.salida_num + 1;
  10.      
  11. RETURN resultado;
  12.  
Luego, la ejecución es simplemente:
Código MySQL:
Ver original
  1. mysql> SELECT dias_sin() dias_sin;
  2. +----------+
  3. | dias_sin |
  4. +----------+
  5. |      143 |
  6. +----------+
  7. 1 row in set (0.05 sec)

¿Se va entendiendo?

Todo lo que codificaste, debido a que estás pensando como programador de aplicaciones, no es correcto para obtener un resultado en SQL. Las soluciones de programacion no sirven usualmente en BBDD.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #15 (permalink)  
Antiguo 13/07/2016, 15:51
Avatar de Libras
Colaborador
 
Fecha de Ingreso: agosto-2006
Ubicación: En la hermosa perla de occidente
Mensajes: 7.412
Antigüedad: 17 años, 7 meses
Puntos: 774
Respuesta: Error en función MySql

Cita:
Iniciado por gnzsoloyo Ver Mensaje

Todo lo que codificaste, debido a que estás pensando como programador de aplicaciones, no es correcto para obtener un resultado en SQL. Las soluciones de programacion no sirven usualmente en BBDD.

:apla uso:

Muy buen comentario, es lo comun despues de aprender a programar todo verlo con la misma logica, pero en bases de datos no se aplica la misma

revisa este link que explica como quitar cursores o ciclos usando queries:

https://blogs.msdn.microsoft.com/sql...et-operations/
__________________
What does an execution plan say to t-sql query? Go f**k yourself, if you are not happy with me
  #16 (permalink)  
Antiguo 14/07/2016, 04:42
 
Fecha de Ingreso: enero-2012
Mensajes: 52
Antigüedad: 12 años, 1 mes
Puntos: 1
De acuerdo Respuesta: Error en función MySql

Muchas gracias!!, por vuestra ayuda en bases de datos voy un poco justo e intento aplicar la lógica de la programación de aplicaciones en la de BBdd, algunas veces funciona pero la mayoría de veces no. Repito, muchas gracias por vuestra ayuda

Etiquetas: fecha, registros, select
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 04:53.