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.