| 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 ...




9 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.


  7. Yoshiro Says:

    Aca le paso otra funcion mas pequeña q calcula lo mismo:

    CREATE DEFINER=`root`@`localhost` FUNCTION `sp_ContarDias`(a DATE,b DATE) RETURNS int(11)
    BEGIN
    DECLARE a1,d,di,df,ban,ban1,resultado INT;
    SET d=DATEDIFF(b,a)+1;
    SET di=DAYOFWEEK(a);
    SET ban=1;
    SET ban1=0;
    WHILE ban<d DO
    IF (di=8) THEN
    SET di=1;
    END IF;
    IF (di=6 OR di=7) THEN
    SET ban1=(ban1+1);
    END IF;
    SET di=(di+1);
    SET ban=(ban+1);
    END WHILE;
    SET resultado=(d-ban1);
    RETURN abs(resultado);
    END

    Para invocar la funcion solo es:
    SELECT sp_ContarDias(Fecha_Inicial,Fecha_Final);
    Ojala le sirva nos vemos bye.


  8. yesid Says:

    Hola..

    disculpa la ignorancia. donde creo esa funcion?. como hago para trabajar con php y llamar la funcion.. Mi problema es el siguiente.

    TEngo una fecha de Prestamo de libros Pero dependiendo del tipo le sumo n dias sin contar sabados y domingos que seria la fecha de entrega.
    Ahora necesito calcular la diferecnia de dias que hay entre la fecha de entrega y la fecha en que se devuelve realmente el libro. dado el caso que se pase de la fecha de entregarlo.. entonces para eso se cobra una multa por los dias pasados.


  9. frankii Says:

    necesito un programa donde permita reservar deacuerdo al as fechas donde permita registrar fechas que aun no han sido dados de alta y que calcule el numero de dias entre ls dos fechas


Leave a Reply