Skip to main content

Mejorando la eficiencia y modularidad de tus consultas SQL

Una función almacenada, también conocida como simplemente función, es un conjunto de instrucciones o bloques de código SQL que se almacenan en una base de datos y pueden ser invocados o llamados en diferentes momentos para realizar tareas específicas. Puede recibir cero o varios parámetros y siempre retorna un valor como resultado. Normalmente, se utiliza mediante una sentencia SELECT o dentro de una expresión.

Para crear una función almacenada se utiliza la sentencia CREATE FUNCTION. A continuación, se presenta un ejemplo de función creada en MySQL, la cual retornará la cantidad de días hábiles entre dos fechas (total de días sin contar fin de semana).

DELIMITER //

CREATE FUNCTION CalcularDiasHabiles(fechaInicio DATE, fechaFin DATE)
RETURNS INT
NO SQL
BEGIN
    DECLARE diasHabiles INT DEFAULT 0;
    DECLARE fechaActual DATE;

    SET fechaActual = fechaInicio;

    WHILE fechaActual <= fechaFin DO
        IF WEEKDAY(fechaActual) NOT IN (5, 6) THEN
            SET diasHabiles = diasHabiles + 1;
        END IF;

        SET fechaActual = fechaActual + INTERVAL 1 DAY;
    END WHILE;

    RETURN diasHabiles;
END //

DELIMITER ;

Como se puede observar, una función almacenada contiene múltiples elementos que pasaremos a detallar a continuación:

  • ‘DELIMITER //’ se utiliza para cambiar el delimitador de sentencias a // en lugar del punto y coma (;) predeterminado, para permitir que la función almacenada contenga sentencias múltiples.
  • ‘CREATE FUNCTION CalcularDiasHabiles(fechaInicio DATE, fechaFin DATE)’ crea la función almacenada llamada «CalcularDiasHabiles» que toma dos parámetros: «fechaInicio» y «fechaFin» de tipo DATE.
  • ‘RETURNS INT’ indica que la función retornará un valor entero.
  • ‘NO SQL’ indica que la función no accede a la base de datos ni modifica datos.
  • ‘BEGIN’ marca el comienzo del bloque de código de la función.
  • ‘DECLARE diasHabiles INT DEFAULT 0;’ declara una variable llamada «diasHabiles» de tipo entero y la inicializa en 0.
  • ‘DECLARE fechaActual DATE;’ declara una variable llamada «currentDate» de tipo DATE para almacenar la fecha actual durante el bucle.
  • ‘SET fechaActual = fechaInicio;’ asigna el valor de «fechaInicio» a la variable «currentDate».
  • ‘WHILE fechaActual ≤ fechaFin DO’ establece un bucle mientras «currentDate» sea menor o igual que «fechaFin».
  • ‘IF WEEKDAY(fechaActual) NOT IN (5, 6) THEN’ verifica si el día de la semana de «fechaActual » no es sábado (5) ni domingo (6).
  • ‘SET diasHabiles = diasHabiles + 1;’ incrementa en 1 el valor de la variable «diasHabiles» si el día actual no es fin de semana.
  • ‘SET currentDate = currentDate + INTERVAL 1 DAY;’ incrementa la fecha actual en un día.
  • ‘END WHILE;’ marca el fin del bucle.
  • ‘RETURN diasHabiles;’ devuelve el valor de la variable «diasHabiles».
  • ‘END //’ marca el fin del bloque de código de la función.
  • ‘DELIMITER ;’ restaura el delimitador de sentencias predeterminado (;).

Para ejecutar la función almacenada, esta se debe llamar de la siguiente forma:

SELECT CalcularDiasHabiles('2023-06-01', '2023-06-30');

Lo que devolverá un total de 22 días.

<solutionops-team> Autor: Jonathan Urrutia </solutionops-team>

× ¿En qué podemos ayudarte?