| Subcribe via RSS

Función en MySQL para contar días entre dos fechas sin contar sábados ni domingos

Octubre 21st, 2008 Posted in mysql

Después de darle muchas vueltas he encontrado esta útil función en los foros de MySQL que permite calcular el número de días que han transcurrido entre dos fechas sin contar fines de semana.

Espero que os sea tan útil como a mí.

DELIMITER $$
 
DROP FUNCTION IF EXISTS `workdaydiff`$$
CREATE FUNCTION workdaydiff(b date, a date) RETURNS int(11)
    DETERMINISTIC
    COMMENT 'working day difference for 2 dates'
BEGIN
 
DECLARE freedays int;
 
SET freedays = 0;
SET @x = DATEDIFF(b, a);
IF @x<0 THEN
SET @m = a;
SET a = b;
SET b = @m;
SET @m = -1;
ELSE
SET @m = 1;
END IF;
SET @x = abs(@x) + 1;
 
SET @w1 = WEEKDAY(a)+1;
SET @wx1 = 8-@w1;
IF @w1>5 THEN
SET @w1 = 0;
ELSE
SET @w1 = 6-@w1;
END IF;
 
SET @wx2 = WEEKDAY(b)+1;
SET @w2 = @wx2;
IF @w2>5 THEN
SET @w2 = 5;
END IF;
 
SET @weeks = (@x-@wx1-@wx2)/7;
SET @noweekends = (@weeks*5)+@w1+@w2;
 
SET @result = @noweekends-freedays;
RETURN @result*@m;
END$$
 
DELIMITER ;

Entradas relacionadas

  1. Problemas al crear una función en MySQL: Error 1064
  2. PHP: Cambiar el set de caracteres en una consulta MySQL
  3. QT+MySQL (2ª parte): Comprobar si está disponible el driver MySQL para QT
  4. QT+MySQL (1ª parte): Compilar el driver MySQL para QT Windows
  5. Chuleta para MySQL
Valoración:
1 Estrella2 Estrellas3 Estrellas4 Estrellas5 Estrellas (Sin calificar)
Loading ... Loading ...

6 Responses to “Función en MySQL para contar días entre dos fechas sin contar sábados ni domingos”

  1. Zarpele Says:

    Sin contar sabanos???

    Saludos…Muy bueno el blog


  2. gorkau Says:

    Sí, es un nuevo día de la semana que han inventado. Ya está corregido, gracias.


  3. Read424 Says:

    Disculpa mi ignorancia, una vez creada la funcion, como haria para que ejecutar dicha funcion? Les comento para que quiero saber y corriganme en caso de que no se pueda hacer con mysql. Estoy desarrollando un sistema de facturacion y quiero generar mis facturas (solo en tabla) de todos los clientes el 1er dia de cada mes. Gracias de ante mano


  4. gorkau Says:

    Una vez creada la función puedes acceder a ella como si fuera una función “normal” de MySQL. Por ejemplo:

    select * from facturas where workdaydiff(fecha_factura, now())>’5′;


  5. Read424 Says:

    si pero estas haciendo consulta a una tabla y llamas a una funcion lo que yo de verdad quiero es llamar la funcion, sin hacer select en ninguna tabla


  6. gorkau Says:

    Pues entonces puedes hacer:

    select workdaydiff(fecha_factura, now());

    y te devolverá el número de días laborables entre ambas fechas.


Leave a Reply