Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   MySQL (https://www.clubdelphi.com/foros/forumdisplay.php?f=21)
-   -   Convertir función MySql a procedimiento Firebird (https://www.clubdelphi.com/foros/showthread.php?t=92234)

solilopi 02-09-2017 22:01:23

Convertir función MySql a procedimiento Firebird
 
Hola, tengo una función en una Bd MySql y estoy intentando convertirla a procedimiento de Firebird. No puedo con ella. Podéis echarme un cable?. Gracias.
Código:

CREATE DEFINER=`root`@`localhost` FUNCTION `dias_sin`() RETURNS smallint(6)
BEGIN
 
DECLARE resultado SMALLINT DEFAULT 0;
 
  SELECT MAX(DATEDIFF(dt1.fecha, dt2.fecha)) INTO resultado FROM datos dt1
    INNER JOIN datos dt2 ON dt1.salida_num = dt2.salida_num + 1;
   
RETURN resultado;
 
END


Casimiro Notevi 02-09-2017 22:55:47

No somos adivinos, no sabemos qué son exactamente esos campos, se supone que devuelve la diferencia entre dos fechas, pero para eso no hace falta crear ningún procedimiento.

manelb 03-09-2017 08:58:55

Cita:

Empezado por Casimiro Notevi (Mensaje 520797)
, pero para eso no hace falta crear ningún procedimiento.

Estoy de acuerdo con lo que dice Casimiro.
En todo caso, lo único que deberías tener en cuenta és la utilización diferente en fitebird de la función DATEDIFF

DATEDIFF(<unidad> FROM <momento1> TO <momento2>)

En tu caso sería

Código SQL [-]
DATEDIFF(DAY FROM dt1.fecha TO dt2.fecha)

solilopi 03-09-2017 14:41:45

Cita:

Empezado por Casimiro Notevi (Mensaje 520797)
No somos adivinos, no sabemos qué son exactamente esos campos, se supone que devuelve la diferencia entre dos fechas, pero para eso no hace falta crear ningún procedimiento.

Hola de nuevo, lo siento, con las prisas y el cansancio no me expliqué. Tengo que recorrer una tabla y extraer la mayor diferencia entre dos fechas consecutivas.

La función lo que hace es comparar una fecha con su anterior y devuelve la mayor diferencia entre dos fechas:
Código:


CREATE DEFINER=`root`@`localhost` FUNCTION `dias_sin`() RETURNS smallint(6)
BEGIN
 
DECLARE resultado SMALLINT DEFAULT 0;
 
  SELECT MAX(DATEDIFF(dt1.fecha, dt2.fecha)) INTO resultado FROM datos dt1
    INNER JOIN datos dt2 ON dt1.salida_num = dt2.salida_num + 1;
   
RETURN resultado;
 
END

Espero que os lo haya aclarado más, y siento el malentendido. Saludos.

ecfisa 03-09-2017 22:42:47

Hola.

Podrías probar algo similar a esto:
Código SQL [-]
SET TERM ^ ;

CREATE OR ALTER PROCEDURE SP_MAXDIF 
RETURNS(
  RESULT INTEGER)
AS
  DECLARE VARIABLE MAXDIF INTEGER;
BEGIN
  AUX    = 0;
  RESULT = 0;
  FOR
    SELECT DATEDIFF(DAY FROM DT1.FECHA TO DT1.FECHA)
  FROM DATOS DT1, DATOS DT2
  WHERE DT1.SALIDA_NUM = DT2.SALIDA_NUM + 1 
    INTO AUX
  DO
    IF(AUX > RESULT) THEN RESULT = AUX;
  SUSPEND;
END^

SET TERM ; ^
De acuerdo a tu código infiero que la columna SALIDA_NUM es numérica ascendente y consecutiva, de otro modo no funcionará el algorítmo.

Algo que no especificas es la unidad en que deseas obtener la diferencia. manelb ya te hizo esa observación y te especificó el formato de la sintáxis en su mensaje.

Mas información sobre la función: DATEDIFF()

Saludos :)

solilopi 04-09-2017 15:42:02

En primer lugar perdon por no haberme explicado correctamente y en segundo lugar muchas gracias por vuestro tiempo. La función devuelve un entero que es el número de días que hay de diferencia máxima entre dos fechas consecutivas. Repito muchas gracias y disculpad por mi error. Saludos.


La franja horaria es GMT +2. Ahora son las 22:07:38.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi