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
- Problemas al crear una función en MySQL: Error 1064
- PHP: Cambiar el set de caracteres en una consulta MySQL
- QT+MySQL (2ª parte): Comprobar si está disponible el driver MySQL para QT
- QT+MySQL (1ª parte): Compilar el driver MySQL para QT Windows
- Chuleta para MySQL
Tags: contar días, mysql



Octubre 21st, 2008 at 11:39 pm
Sin contar sabanos???
Saludos…Muy bueno el blog
Octubre 22nd, 2008 at 7:38 am
Sí, es un nuevo día de la semana que han inventado. Ya está corregido, gracias.
Noviembre 12th, 2008 at 11:51 pm
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
Noviembre 13th, 2008 at 9:30 am
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′;
Noviembre 14th, 2008 at 11:32 pm
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
Noviembre 15th, 2008 at 10:13 am
Pues entonces puedes hacer:
select workdaydiff(fecha_factura, now());
y te devolverá el número de días laborables entre ambas fechas.
Abril 26th, 2009 at 3:58 am
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.
Junio 21st, 2009 at 5:49 am
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.
Junio 24th, 2009 at 10:08 pm
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