sql >> Base de Datos >  >> RDS >> Mysql

Función MySQL para encontrar el número de días hábiles entre dos fechas

Esta expresión -

5 * (DATEDIFF(@E, @S) DIV 7) + MID('0123444401233334012222340111123400012345001234550', 7 * WEEKDAY(@S) + WEEKDAY(@E) + 1, 1)

calcula el número de días hábiles entre la fecha de inicio @S y la fecha de finalización @E.

Supone que la fecha de finalización (@E) no es anterior a la fecha de inicio (@S). Compatible con DATEDIFF en el sentido de que la misma fecha de inicio y fecha de finalización da cero días hábiles. Ignora los días festivos.

La cadena de dígitos se construye de la siguiente manera. Cree una tabla de días de inicio y días de finalización, las filas deben comenzar con el lunes (WEEKDAY0) y las columnas también deben comenzar con el lunes. Rellene la diagonal desde la parte superior izquierda hasta la parte inferior derecha con todos los 0 (es decir, hay 0 días laborables entre lunes y lunes, martes y martes, etc.). Para cada día, comience en la diagonal (siempre debe ser 0) y rellene las columnas hasta el Bien, un día a la vez. Si aterriza en una columna de día de fin de semana (día no laborable), el número de días laborables no cambia, se lleva desde la izquierda. En caso contrario, el número de días hábiles aumenta en uno. Cuando llegue al final de la fila, vuelva al principio de la misma fila y continúe hasta que alcance la diagonal nuevamente. Luego pasa a la siguiente fila.

P.ej. Suponiendo que el sábado y el domingo no sean días hábiles -

 | M T W T F S S
-|--------------
M| 0 1 2 3 4 4 4
T| 4 0 1 2 3 3 3
W| 3 4 0 1 2 2 2
T| 2 3 4 0 1 1 1
F| 1 2 3 4 0 0 0
S| 1 2 3 4 5 0 0
S| 1 2 3 4 5 5 0

Luego concatene los 49 valores de la tabla en la cadena.

Por favor, avíseme si encuentra algún error.

-Editar tabla mejorada:

 | M T W T F S S
-|--------------
M| 0 1 2 3 4 4 4
T| 4 0 1 2 3 3 3
W| 3 4 0 1 2 2 2
T| 2 3 4 0 1 1 1
F| 1 2 3 4 0 0 0
S| 0 1 2 3 4 0 0
S| 0 1 2 3 4 4 0

cadena mejorada:'0123444401233334012222340111123400001234000123440'

expresión mejorada:

5 * (DATEDIFF(@E, @S) DIV 7) + MID('0123444401233334012222340111123400001234000123440', 7 * WEEKDAY(@S) + WEEKDAY(@E) + 1, 1)