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

Error en Procedimiento Almacenado (por desconocimiento)

Estas en el tema de Error en Procedimiento Almacenado (por desconocimiento) en el foro de Mysql en Foros del Web. Hola, bien como dice el titulo tengo un error y se debe unicamente a desconocimiento, he estado leyendo todo el dia para aprender a hacerlo ...
  #1 (permalink)  
Antiguo 21/07/2011, 17:05
Avatar de omar1977  
Fecha de Ingreso: abril-2006
Mensajes: 178
Antigüedad: 18 años
Puntos: 4
Error en Procedimiento Almacenado (por desconocimiento)

Hola,
bien como dice el titulo tengo un error y se debe unicamente a desconocimiento, he estado leyendo todo el dia para aprender a hacerlo y finalmente recurro a ustedes el cuento es el siguiente.
Necesito que este proc. almacenado me entrege una diferencia de tiempos (en un solo campo, un solo valor), la instruccion SELECT funciona correctamente si la ejecuto sola, tanto en consola como en QueryBrowser, pero necesito que este dentro de un procedimiento almacenado.

Cita:
DELIMITER $$

DROP PROCEDURE IF EXISTS `sp_tpodisponible` $$
CREATE PROCEDURE `sp_tpodisponible`(IN fini DATE, IN fter DATE)
BEGIN


SELECT TIMEDIFF(
CONCAT(date_format(`tiempom`.`t`.`fecha_ter`,_utf8 '%Y-%m-%d'),
_utf8' ',
(SELECT MAX(`tiempom`.`tb_ing_producto`.`hora_ter`)
FROM `tiempom`.`tb_ing_producto`
WHERE (`tiempom`.`tb_ing_producto`.`fecha_ter` = fter)
)
),
CONCAT(date_format(`tiempom`.`t`.`fecha_ini`,_utf8 '%Y-%m-%d'),
_utf8' ',
(SELECT MIN(`tiempom`.`tb_ing_producto`.`hora_ini`)
FROM `tiempom`.`tb_ing_producto`
WHERE (`tiempom`.`tb_ing_producto`.`fecha_ini` = fini)
)
)
)
FROM `tiempom`.`tb_ing_producto` `t`
LIMIT 1$$

END $$

DELIMITER ;
Los campos usados son
fecha_ini, fecha_ter DATETIME de forma YYYY-mm-dd 00:00:00 (no tiene hora)
hora_ini, hora_ter TIME

Desde ya muchas gracias por los aportes.

Atte
__________________
no hay nadie que sea tan inutil, por ultimo sirve como mal ejemplo
  #2 (permalink)  
Antiguo 21/07/2011, 20:24
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: Error en Procedimiento Almacenado (por desconocimiento)

El cambio de fin de sentencia del DELIMITER es para poder poner el SP en la base como una sola cosa, pero el $$ en este caso debe ir sólo después del END y en ninguna otra parte.
Interiormente, las sentencias siguen estando escritas con ";".
Por otro lado hay al menos tres de detalles:
1. La fecha como la estás formateando es el formato por default de salida, por lo que no se comprende para qué la formateas así. bastaría con usar DATE() sobre el resultado de la función para obtener el dato como fecha. Por el modo en que manipulas la información.
2. Si el campo es DATETIME, ¿qué sentido tiene usar entonces en esa tabla un campo TIME para la hora? ¿Por qué no pusiste todo el dato entero? Desperdicias espacio y capacidades de cálculo al hacerlo.
3. Estás haciendo una sintaxis innecesariamente complicada. Si usas una sola tabla, y en el FROM ya indicas la base y la tabla, no es necesario usar lo mismo al invocar el campo, ya que de todos modos será siempre sobre esa tabla. Se indican si hay un JOIN entre tablas, pero no si es una sola.

Mi propuesta:
Código MySQL:
Ver original
  1. DELIMITER $$
  2.  
  3. DROP PROCEDURE IF EXISTS `sp_tpodisponible` $$
  4. CREATE PROCEDURE `sp_tpodisponible`(IN fini DATE, IN fter DATE)
  5.   SELECT TIMEDIFF(ftermina, finicia)
  6.   FROM
  7.     (SELECT MAX(ADDTIME(DATE(`fecha_ter`), `hora_ter`)) ftermina
  8.     FROM `tiempom`.`tb_ing_producto` tip
  9.     WHERE `fecha_ter` = fter) T1
  10.   JOIN
  11.     (SELECT MIN(ADDTIME(DATE(`fecha_ini`), `hora_ini`)) finicia
  12.     FROM `tiempom`.`tb_ing_producto` tip
  13.     WHERE `fecha_ini` = fini) T2
  14.   LIMIT 1;
  15. END $$
  16.  
  17. 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)
  #3 (permalink)  
Antiguo 22/07/2011, 09:21
Avatar de omar1977  
Fecha de Ingreso: abril-2006
Mensajes: 178
Antigüedad: 18 años
Puntos: 4
Respuesta: Error en Procedimiento Almacenado (por desconocimiento)

Hola. gracias por la respuesta me deja muy claro lo que tengo que hacer, ahora bien el por que de complicarme dando formato a algo que deberia estar bien hecho, es solo que esa informacion la recibo de un PLC que no puedo manipular, solo cuento con esos datos mal guardados.

Ahora explico la instruccion, necesito calcular para una fecha fini la menor hora para dar como inicio del proceso y para una fecha fter la mayor hora para dar con el termino del proceso, como comprendera debo hacer eso dado que el campo fini y fter estan el tipo DATETIME pero almacena solo la fecha no la hora, y la hora esta almacenada en los campos hora_ini y hora_ter que son de tipo TIME.

es una lata que la gente no haga las cosas como corresponden, pero bueno, aca estamos nosotros para arreglarlo no.

Atte y gracias


ALEXI
__________________
no hay nadie que sea tan inutil, por ultimo sirve como mal ejemplo
  #4 (permalink)  
Antiguo 22/07/2011, 09:31
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: Error en Procedimiento Almacenado (por desconocimiento)


No desesperes. Deberías ver las bases de datos que crearon los ingenieros de la empresa en la que trabajo antes de que yo entrara... El "peor escenario posible" que mencionaban mis profesores se quedó muy corto.

Como sea, explico el detalle de lo que hace lo que te puse. En ambos casos el esquema es el mismo:
Código MySQL:
Ver original
  1. SELECT MAX(ADDTIME(DATE(`fecha_ter`), `hora_ter`)) ftermina
  2. FROM `tiempom`.`tb_ing_producto` tip
  3. WHERE `fecha_ter` = fter
- DATE() "corta" el datetime y devuelve la fecha.
- ADDTIME(fecha, hora) devuelve un DATETIME que combina la fecha y la hora dadas.
- MAX() devuelve un único dato (el máximo), por lo que haciendo un JOIN con la otra subconsulta todo develve sólo los dos valores: la fecha y hora máximas y la mínima, que es lo que usas luego para el TIMEDIFF().

Teóricamente, lo que te puse debería devolver lo mismo que todo lo que posteaste tu.

¿Lo has probado?
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #5 (permalink)  
Antiguo 22/07/2011, 09:48
Avatar de omar1977  
Fecha de Ingreso: abril-2006
Mensajes: 178
Antigüedad: 18 años
Puntos: 4
Respuesta: Error en Procedimiento Almacenado (por desconocimiento)

Lo probe a penas lo lei y no me da el mismo resultado que deberia, lo ejecuto y deberia entregarme un campo tipo DATETIME pero me entrega solo la hora....
lo corregí y me entrega el valor que necesito

Código:
SELECT CONCAT(DATE(`fecha_ter`),' ', MAX(`hora_ter`)) ftermina
FROM `tiempom`.`tb_ing_producto` tip
WHERE `fecha_ter` = fter;
Muchas gracias amigo...
__________________
no hay nadie que sea tan inutil, por ultimo sirve como mal ejemplo

Etiquetas: campos, procedimiento, query, select, almacenar
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 08:54.