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

Problema con fechas en Stored Procedure

Estas en el tema de Problema con fechas en Stored Procedure en el foro de Mysql en Foros del Web. Saludos a todos Tengo el siguiente problema. Tengo la siguiente tabla llamada recorrido vehiculo Código: ID_RECORRIDO_VEHICULO ID_VEHICULO LONGITUD LATITUD TAG FECHA HORA KILOMETROS_RECORRIDOS ------------------------ -------------- ...
  #1 (permalink)  
Antiguo 09/04/2009, 13:46
 
Fecha de Ingreso: marzo-2008
Ubicación: Zacatecas
Mensajes: 45
Antigüedad: 16 años, 1 mes
Puntos: 1
Problema con fechas en Stored Procedure

Saludos a todos

Tengo el siguiente problema.
Tengo la siguiente tabla llamada recorrido vehiculo
Código:
ID_RECORRIDO_VEHICULO     ID_VEHICULO     LONGITUD      LATITUD     TAG     FECHA      HORA         KILOMETROS_RECORRIDOS    
 ------------------------  --------------  ------------  ----------  ------  ---------  -----------  ------------------------ 
 2                         2               -102.6437942  22.7683047  tag1    2009/04/07  08:05:00 AM  0                        
 3                         2               -102.6297142  22.7723965  tag1    2009/04/07  08:10:00 AM  0                        
 4                         2               -102.6222349  22.774792   tag1    2009/04/07  08:15:00 AM  0                        
 5                         2               -102.6135026  22.7754072  tag1    2009/04/07  08:20:00 AM  0                        
 6                         1               -102.6067245  22.7747583  tag1    2009/04/09  08:25:00 AM  0                        
 7                         1               -102.5945086  22.7734048  tag1    2009/04/09  08:30:00 AM  0                        
 8                         1               -102.585904   22.7739324  tag1    2009/04/09  08:35:00 AM  0
Tengo un procedimiento almacenado con la siguiente estructura
Código:
drop procedure IF EXISTS insertDistance;
go
CREATE PROCEDURE insertDistance(IN fecha date)
BEGIN
  DECLARE done INT DEFAULT 0;
  DECLARE id  INTEGER; 
  DECLARE lat double;
  DECLARE lng double;
 
  DECLARE curPuntos CURSOR FOR SELECT ID_RECORRIDO_VEHICULO,LATITUD,LONGITUD FROM recorrido_vehiculo 
  where FECHA=fecha;
  DECLARE CONTINUE HANDLER FOR SQLSTATE '02000' SET done = 1;
  OPEN curPuntos;
  REPEAT
    FETCH curPuntos INTO id,lat,lng;
    IF NOT done THEN          
       insert into tmp (ID,LATITUD,LONGITUD,FECHA) values (id,lat,lng,fecha);
    END IF;
  UNTIL done END REPEAT;
  CLOSE curPuntos;
END
Es un procedimiento en el que le paso un paramentro de tipo Date, para hacer una consulta por medio de ese campo en un cursor, y en base a ese resultado, pues inserto datos en otra tabla llamada tmp.

El problema es que no me respeta el select del cursor.

Mando llamar el procedimiento de esta forma:

Código:
call insertDistance('2009-04-07')
Segun mi tabla de datos, me deberia de filtrar solo 4 resgistros y me los filtra todos.
La pregunta es, esta mal el select

Código:
 DECLARE curPuntos CURSOR FOR SELECT ID_RECORRIDO_VEHICULO,LATITUD,LONGITUD FROM recorrido_vehiculo 
  where FECHA=fecha;
Con un tipo de datos int o varchar si funciona.Por ejemplo esto si funciona:

Código:
 DECLARE curPuntos CURSOR FOR SELECT ID_RECORRIDO_VEHICULO,LATITUD,LONGITUD FROM recorrido_vehiculo 
  where id_recorrido_vehiculo=2;
Espero que alguien me pueda ayudar, ya perdi mucho tiempo c on este problema.

Saludos

Última edición por itinajero; 09/04/2009 a las 13:57
  #2 (permalink)  
Antiguo 10/04/2009, 18:43
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, 5 meses
Puntos: 2658
Respuesta: Problema con fechas en Stored Procedure

Estás usando el mismo nombre para la variable del parámetro de entrada que para el nombre del campo.
Es mejor evitar eso porque MySQL puede confundirse al interpretar los nombres.
Como el nombre del campo tiene prioridad por jerarquía de objetos, entonces el falor que asume es el de campo y no el de variable. Esto implica que la comparación FECHA = Fecha se hace con el valor del campo FECHA sobre si mismo... lo que siempre es TRUE. Por eso te está devolviendo todos los registros.
Pon mejor algo así:
Código sql:
Ver original
  1. DEMILITER GO;
  2. DROP PROCEDURE IF EXISTS insertDistance;
  3. GO
  4. CREATE PROCEDURE insertDistance(IN vfecha DATE)
  5. BEGIN
  6.   DECLARE done INT DEFAULT 0;
  7.   DECLARE id  INTEGER;
  8.   DECLARE lat DOUBLE;
  9.   DECLARE lng DOUBLE;
  10.  
  11.   DECLARE curPuntos CURSOR FOR
  12.       SELECT ID_RECORRIDO_VEHICULO, LATITUD, LONGITUD
  13.       FROM recorrido_vehiculo
  14.       WHERE FECHA=vfecha;
  15.  
  16.   DECLARE CONTINUE HANDLER FOR SQLSTATE '02000' SET done = 1;
  17.  
  18.   OPEN curPuntos;
  19.   REPEAT
  20.     FETCH curPuntos INTO id,lat,lng;
  21.     IF NOT done THEN          
  22.        INSERT INTO tmp (ID,LATITUD,LONGITUD,FECHA) VALUES (id,lat,lng,vfecha);
  23.     END IF;
  24.   UNTIL done END REPEAT;
  25.  
  26.   CLOSE curPuntos;
  27.  
  28. END
  29. GO
  30. DELIMITER ;
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
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 11:26.